Domanda

Ciao, ho una classe " A " con il metodo astratto

protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList);

Voglio sovrascrivere questo metodo nella classe derivata "B" con le seguenti condizioni

  • Dovrebbe essere privato per la classe B.

il compilatore non mi consente di dichiarare questo metodo come privato nella classe derivata "B" qual è la sintassi corretta?

È stato utile?

Soluzione

Non puoi. Ciò violerebbe il livello di accessibilità dichiarato in classe A. A parte qualsiasi altra cosa, impedirebbe che sia richiamabile dalla classe A! Cosa ti aspetti che accada se il codice in classe A prova a chiamare il metodo astratto che in qualche modo avresti sovrascritto con un'implementazione privata?

È possibile rendere privata l'implementazione principale e quindi creare un metodo protetto che chiama semplicemente quello privato, se proprio lo si desidera.

Perché vuoi rendere il metodo privato in primo luogo, quando è progettato per essere richiamabile da A?

EDIT: Okay, ora hai spiegato nel tuo commento cosa vuoi fare, non puoi farlo. Il più vicino che puoi venire è passare un delegato al costruttore di A - quel delegato può fare riferimento a un metodo privato. Purtroppo, non puoi utilizzare " questo " quando passi argomenti nelle catene di costruttori, quindi sei costretto a fare qualcosa di orribile come scrivere un metodo statico che prende " questo " come primo parametro, in effetti ... tranne per il fatto che dovrà lanciare anche il tipo giusto, poiché il genitore non può dichiarare quale tipo dovrebbe essere. Il genitore chiamerebbe quindi il delegato invece del metodo protetto.

Nota che ciò impedirebbe anche a ulteriori classi derivate di "sostituire" " inoltre, che può o meno essere desiderabile.

È incredibilmente tortuoso, e proverei ad evitarlo laddove possibile. Se sei davvero preoccupato di ciò che potrebbero fare le classi derivate, proverei invece a sigillare la classe e costringere le persone a usare la composizione anziché l'eredità. La lingua non ti aiuta davvero a fare quello che vuoi qui.

Altri suggerimenti

Come regola OOPS generale, non è possibile ridurre la visibilità di un membro durante l'override. Quindi non è consentito passare da protetto a privato.

Non è possibile modificare il livello di accesso dei metodi virtuali in C #. Puoi dichiararlo nuovamente usando la parola chiave new , ma questa è una dichiarazione che nasconde il metodo precedente, quindi non funzionerà come previsto se hai a che fare con oggetti che differiscono nel tipo dichiarato e effettivo o se esegui il cast di routine di oggetti in un tipo di classe base.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top