C# accessibilità a proprietà di classi ereditate

sabato 19 giugno 2010 - 14.03

andrestu Profilo | Expert

faccio un esempio banale:
ho classe1, classe2, classe3

classe3 eredita classe2 che a sua volta eredita classe1

se sono all'interno della classe3 è voglio accedere ad una proprietà della classe2 utilizzo la sintassi "base.nomeProprietà", funziona ugualmente se volessi accedere ad una proprietà della classe1 sempre dalla classe3 ???

nico839 Profilo | Senior Member

ciao,
secondo me si, dal momento che la classe 3 ereditando da classe 2 ha tutte le proprietà di classe 2 quindi ha anche quelle ereditate da classe 1,poi non ho mai provato, se mi sbaglio scusate....
Ciao.
Nicolas

kataklisma Profilo | Senior Member

Ciao!

>faccio un esempio banale:
>ho classe1, classe2, classe3
>
>classe3 eredita classe2 che a sua volta eredita classe1
>
>se sono all'interno della classe3 è voglio accedere ad una proprietà
>della classe2 utilizzo la sintassi "base.nomeProprietà", funziona
>ugualmente se volessi accedere ad una proprietà della classe1
>sempre dalla classe3 ???

Certo che è possibile! L'ereditarietà serve proprio a questo! Pensa a tutte le classi (tutte!) che ereditano dalla classe object e che a loro volta vengono ereditate... ;)

Ciao!

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

andrestu Profilo | Expert

e si immaginavo solo che lo chiedo perchè mi è capitato qualche volta di non riuscire ad accedere ad alcune proprietà, il motivo pensa che sia dato dal fatto che queste proprietà sono dichiarate in modo diverso se non ho capito male (tipo "internal") oppure ci potrebbe essere qualche altra ragione per il quale non riesco ad accedervi?
il fatto è che analizzando alcuni classi del .net con reflector volevo provare a riprodurle con alcune mie modifiche solo che per l'appunto nel far questo mi è capitato di non riuscire ad accedere a qualche proprietà, cosa che invece accadeva nella classe originale da cui prendevo spunto... la cosa è strana però, se riesco vi posto un pò di codice in modo da farvi un esempio pratico

kataklisma Profilo | Senior Member

Ciao!

>e si immaginavo solo che lo chiedo perchè mi è capitato qualche
>volta di non riuscire ad accedere ad alcune proprietà, il motivo
>pensa che sia dato dal fatto che queste proprietà sono dichiarate
>in modo diverso se non ho capito male (tipo "internal") oppure
>ci potrebbe essere qualche altra ragione per il quale non riesco
>ad accedervi?

Se sono dichiarate private non saranno accessibili mai, se sono dichiarate internal saranno accessibili soltanto nell' assembly di dichiarazione :)

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

andrestu Profilo | Expert

scusa cosa intendi con "assembly di dichiarazione"??? il namesapace in cui sono dichiarate le classi?

kataklisma Profilo | Senior Member

Ciao!

>scusa cosa intendi con "assembly di dichiarazione"??? il namesapace
>in cui sono dichiarate le classi?

No, assembly e namespaces sono due cose differenti.

L'assembly è quel file di output (exe o dll) che il compilatore crea, i namespaces sono dei "nominativi" attribuiti ad un gruppo di classi e sono presenti negli assembly :)

Ciao!

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

andrestu Profilo | Expert

si si conosco gli assembly e che non capivo molto l'attinenza...
quindi diciamo che se dichiaro una proprietà internal in una classe "miaclasse1" che includo in un assembly pippo.dll e se poi utilizzo questo assembly in un mio progetto e successivamente in questo mio progetto creo una classe "miaclasse2" ereditata da "miaclasse1" non riuscirò ad accedere dalla "miaclasse2" alle proprietà di "miaclasse1" dichiarate internal, giusto?

kataklisma Profilo | Senior Member

>si si conosco gli assembly e che non capivo molto l'attinenza...
>quindi diciamo che se dichiaro una proprietà internal in una
>classe "miaclasse1" che includo in un assembly pippo.dll e se
>poi utilizzo questo assembly in un mio progetto e successivamente
>in questo mio progetto creo una classe "miaclasse2" ereditata
>da "miaclasse1" non riuscirò ad accedere dalla "miaclasse2"
>alle proprietà di "miaclasse1" dichiarate internal, giusto?

Dipende in che assembly dichiari "miaclasse2" se lo dichiari nell'assembly di "miaclasse1" ovvero Pippo.dll sarà visibile altrimenti no anche se ci sono vari modi per utilizzare risorse internal in assembly esterni.


------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

andrestu Profilo | Expert

scusa l'ignoranza, cosa intendi per "Dipende in che assembly dichiari miaclasse2" ???
ma se pippo.dll è già compilato e ammettiamo che non posso ricompilarlo con la nuova classe, cè il modo di creare un ulteriore classe esterna dicendogli che fa parte dell'assembly pippo.dll in modo da poter accedere alle proprietà internal delle classi che sono dentro pippo.dll ?

cioè x fare un esempio banale:

- creo un nuovo progetto
- inserisco nella folder Bin pippo.dll
- creo una nuova classe nella folder App_Code chiamata "miaclasse" che eredita da una classe contenuta dentro pippo.dll

a questo punto posso dichiarare in qualche modo che "miaclasse" fa parte dell'assembly pippo.dll in modo da poter accedere alle proprietà internal delle classi di pippo.dll oppure non è possibile?

kataklisma Profilo | Senior Member

>scusa l'ignoranza, cosa intendi per "Dipende in che assembly
>dichiari miaclasse2" ???
>ma se pippo.dll è già compilato e ammettiamo che non posso ricompilarlo
>con la nuova classe, cè il modo di creare un ulteriore classe
>esterna dicendogli che fa parte dell'assembly pippo.dll in modo
>da poter accedere alle proprietà internal delle classi che sono
>dentro pippo.dll ?
>
>cioè x fare un esempio banale:
>
>- creo un nuovo progetto
>- inserisco nella folder Bin pippo.dll
>- creo una nuova classe nella folder App_Code chiamata "miaclasse"
>che eredita da una classe contenuta dentro pippo.dll
>
>a questo punto posso dichiarare in qualche modo che "miaclasse"
>fa parte dell'assembly pippo.dll in modo da poter accedere alle
>proprietà internal delle classi di pippo.dll oppure non è possibile?

No non è possibile, i vari metodi che estendono le classi internal ad ulteriori classi esterne devono essere implementati nel codice sorgente della risorsa principale, in questo caso Pippo.dll, se pippo è gia compilato non puoi mostrare membri internal a classi esterne.
------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5