5.360 messaggi dal 09 febbraio 2002
Contributi
Ciao a tutti,

ho una classe normale, contenente alcuni metodi. Esempio:

public class Genitore {
public void Metodo1{}
public void Metodo2{}
public void Metodo3{}
}


vorrei fare in modo che una classe Figlio che eredita da Genitore nascondesse Metodo3 in modo che non sia utilizzabile. Per far questo ho provato ad eseguire l'override con il modificatore private. Prima ho tentato questo:

public class Figlio : Genitore{
private new void Metodo3{}
}


e poi ho provato anche:

public class Figlio : Genitore{
private ovverride void Metodo3{}
}


ma niente, Metodo3 è ancora visibile come Genitore.Metodo3(). Infatti, posso fare:

Figlio obj = new Figlio();
obj.Metodo3();


Come faccio a sbarazzarmi di Metodo3 nella classe Figlio? Per chiarire bene: non deve essere visibile neanche nell'intellisense.
Modificato da BrightSoul il 14 maggio 2008 12.08 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
BrightSoul ha scritto:
Come faccio a sbarazzarmi di Metodo3 nella classe Figlio?

Semplicemente non puoi: sarebbe contro ogni logica OOP.
Puoi "nascondere" l'implementazione di un membro (override o new keywords) ma non la sua "presenza".
Nel tuo caso specifico probabilmente non stai usando in modo corretto l'ereditarietà: prova a rispondere alla semplice domanda "Figlio è Genitore?"
HTH

Matteo Casati
GURU4.net
5.360 messaggi dal 09 febbraio 2002
Contributi
grazie, temevo che non si potesse fare. Ho risolto in altro modo un po' meno elegante.

Nel tuo caso specifico probabilmente non stai usando in modo corretto l'ereditarietà:


ti faccio un esempio della situazione in cui mi trovo: immagina la classe Luigi che eredita dalla classe EssereUmano. EssereUmano tra i suoi metodi ha cammina() corri() e salta(). Il povero Luigi è nato zoppo, ma è pur sempre un essere umano. Ecco il motivo per cui voglio nascondere quei metodi, per evitargli l'imbarazzo di restituire un'eccezione quando gli si chiede salta().


Ho risolto aggiungendo una classe Zoppo. Sia Luigi che EssereUmano ereditano da quella. In più, EssereUmano aggiunge il metodo salta().
Se si può nascondere un metodo facendone l'override e lasciando che lanci NotImplementedException() non vedo perché non si possa sopprimere il metodo del tutto. A livello logico non mi sembra tanto strano.
Modificato da BrightSoul il 14 maggio 2008 16.11 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
BrightSoul ha scritto:
Ecco il motivo per cui voglio nascondere quei metodi, per evitargli l'imbarazzo di restituire un'eccezione quando gli si chiede salta()

LOL
Esempio eccezionale!!!


Se si può nascondere un metodo facendone l'override e lasciando che lanci NotImplementedException() non vedo perché non si possa sopprimere il metodo del tutto.

Invece a me sembra corretto. A parte che un metodo che alza eccezioni by-design già "puzza" un po' (di solito denota qualche errore di progettazione) non è possibile rimuoverlo proprio a livello logico: immagina la classe Chitarra che implementa l'interfaccia IStrumentoMusicale() rimuovendo il metodo Suona() come da te ipotizzato (la chitarra ha le corde rotte, insomma è un po' come Luigi che è zoppo ma più politically correct  ) e di avere il seguente codice:
IStrumentoMusicale strumento = new Chitarra();

(codice derivato ad esempio dall'uso di un abstract factory pattern)
Come la mettiamo? L'istanza "strumento" *DEVE* avere il metodo Suona() anche se poi l'implementazione è stonata, muta o... alza un'eccezione (tipo CordaRottaException!)

Spero di averti convinto.
Alla prossima!

Matteo Casati
GURU4.net

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.