Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.NET] Oscurare una classe Public

Salve a tutti,
ho un' Assembly con due classi Public , A e B
Purtroppo non posso rendere B Friend, in quanto eredita da un componente, e
B viene utilizzata in A.
Quindi l'Assembly è composta dalle classi A e B.
Se l'utilizzatore vuole accedere ai metodi del componente ereditato,
la classe B deve essere Public.
Vorrei che in sviluppo venga visualizzata solo la classe A,
invece si mostrano ambedue.
Esiste, forse qualche Attributo, che mi permette di oscurare la classe
Public B ?
Grazie
giuseppeD

GiuseppeD wrote:

Non ho ben chiaro la situazione ma credo che devi
- Marcare B come MustInherit (in modo che sia obbligatorio ereditarla)
- Marcare la sub new di B come protected (in modo che B possa essere 
creata solo dai suoi derivati)
Ciao

 creata solo dai suoi derivati)
Ho una prima classe:
Public class Alfa
 Inherits System.Windows.Forms.TextBox
'Diversi metodi
Seconda classe:
Public Class Beta
    Inherits System.Windows.Forms.UserControl
Un Controllo utente, dove inserisco il componente composto dalla classe Alfa
e altri componenti.
Aggiungo la TextBox
Me.TextBox1 = New NomeSpace.Alfa
Per accedere alle proprietà, dal client, della TextBox
modifico la proprietà Modifiers=Public
E' questo valore che obbliga l'assegnare Public alla classe Alfa
Altrimenti, lasciare Modifiers=Friend ; la classe Alfa può essere Friend ;
ma per intervenire sulle proprietà della TextBox dovrei aggiungere una serie
di Property per quanto sono le proprietà della classe.
Quindi Modifiers=Public
Aggiungo il componente ad un proggetto
importo
Imports Namespace.
dopo il punto mi compaiono la classe Alfa e la Beta,
dove per la TextBox accedo alle proprietà da ambedue.
Sarebbe opportuno cha la classe Alfa non apparisse.
Ave
giuseppeD

 Sarebbe opportuno cha la classe Alfa non apparisse.
Boh ;)
Non ti capisco :P
Ciao

 Non ti capisco :P
Spero di essere stato più chiaro.
Ave
giuseppeD


Aaahh! :)
Ho capito
tu hai un controllo con dentro la tua classe alfa.
Dato che non vuoi rimappare le proprietà di alfa, devi rendere questa
pubblica.
Ovviamente se è pubblica, è appunto... pubblica :)
l'unica cosa che puoi fare è nascondere la Sub New firmandola come Friend,
in modo che la classe non dovrebbe (non ricordo se si comporta così)
apparire nell'elenco delle classi creabili.
Sicuramente non sarà creabile dall'esterno, ma deve essere visibile se vuoi
che i suoi metodi siano direttamente accessibili.
Non credo esista altra via.
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

Ciao!
[Super CUT]
Oltre a quello che ti ha già detto Zanna che proteggerà la tua classe dalla
possibilità di essere creata all'esterno ti consiglio questo attributo per
la classe che deriva da TextBox:
<TypeLibFunc(TypeLibFuncFlags.FHidden)>
In effetti non l'ho mai provato, ma dovrebbe funzionare... La classe non
sarà visibile negli elenchi delle classi dell'assembly. E' solo un "trucco"
in effetti la classe c'é, ma con la Sub New Friend non sarà creabile,
quindi trucco + Creatore Friend = (spero) soluzione del problema! :-)
    Ciao
        Allanon
-- 
- SPAMKILLER
 lasciate il NOSPAM nell'indirizzo: 
itlangv...@michele.sytes.net
 e lasciate la parola SPAMKILLER nel corpo dell'email

 quindi trucco + Creatore Friend = (spero) soluzione del problema! :-)
Rispondo ad ambedue.
Presumo sia un problema di eredità.
Non posso dichiarare Friend la classe, quindi non visibile all'esterno del
proggetto,
e rendere le proprietà della classe Public, quindi visibili all'esteno.
Presumo che l'attributo corretto per una classe sia
<TypeLibType(TypeLibTypeFlags.FHidden)>
ma il detto non mi permette di instaziare la classe all'interno dello stesso
proggetto.
Ave
giuseppeD

 proggetto.
Allora, TypeLibType e TypeLibTypeFlags stando alla guida (e anche al 
loro nome) agiscono solo su classi esposte come oggetti COM, quindi non 
credo proprio faccia per te.
Poi, la classe *deve* essere pubblica.
Quello che devi definire come friend è la Sub New, il che ti permetterà 
di istanziare la classe dall'interno del tuo progetto ma non dall'esterno.
Non è un problema di eredità, ma proprio di visibilità.
Ciao

 ha scritto nel messaggio
news:c3f7h9$25doph$2...@ID-184808.news.uni-berlin.de...

Ottimo suggerimento.
Definendo la New come Friend per classe Alfa:
 Friend Sub New()
     'Nessuna riga di codice
 End Sub
è istanziabile solo all'interno del progetto. No dall'esterno.
E' un passo avanti.
Rimane la visualità delle due classi all'esterno del proggetto.
Una istanziabile, l'altra no
Ritengo che manchi un attributo che oscuri una classe Pubblica all'esterno
del proggetto.
Grazie
giuseppeD

 del proggetto.
Allora... dato che tu la classe alfa comunque la esponi, anche se tramite la
tua classe beta, *non* può essere nascosta, in qualunque caso.
E non avrebbe senso, poichè io potrei voler fare qualcosa del tipo:
Dim myAlfa as Alfa = MyBeta.ClasseAlfa
myAlfa.AlfaMethod
E' concettualmente sbagliato volerla nascondere (nonchè impossibile).
Nascondendo il New invecie tu continuerai a vedere la tua classe Alfa
(perchè c'è!) ma quando farai
Dim myAlfa As New ...
non la otterrai nell'elenco poichè non è creabile.
Credo che questa situazione sia ottimale.
