Frage

Hallo, ich habe eine Klasse "A" mit als abstrakter Methode

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

Ich mag diese Methode in abgeleiteten Klasse „B“ außer Kraft zu setzen mit folgenden Bedingungen

  • Es sollte auf B-Klasse privat sein.

Compiler erlaubt mir nicht, diese Methode als privat zu deklarieren in abgeleiteten Klasse „B“ Was ist die korrekte Syntax?

War es hilfreich?

Lösung

Sie können nicht. Das würde die Zugänglichkeit Ebene verletzt in der Klasse A. Abgesehen von alles anderen erklärt, würde es sie daran hindern, nach Klasse A aufrufbar sein! Was würden Sie erwarten passieren, wenn Code in der Klasse A versucht, die abstrakte Methode zu nennen, die man irgendwie mit einer privaten Implementierung außer Kraft gesetzt würde?

Sie können die Haupt-Implementierung privat machen und dann eine geschützte Methode erstellen, die nur die privaten nennt, wenn Sie wirklich wollen.

Warum wollen Sie die Methode privat in erster Linie machen wollen, wenn es entworfen von A aufrufbar zu sein?

EDIT: Okay, jetzt können Sie in Ihrem Kommentar erklärt haben, was Sie tun möchten, können Sie es nicht tun. Die nächstgelegene Sie kommen können, ist ein Vertreter der A Konstruktor übergeben - das Delegat zu einer privaten Methode verweisen. Leider kann man nicht „die“ verwenden, wenn Sie Argumente in Konstruktor Ketten übergeben, so dass Sie etwas Schreckliches wie das Schreiben eine statisch Methode dazu gezwungen, die „diesen“ als ersten Parameter nimmt, effektiv ... außer, dass es diese an die richtige Art zu werfen und, da die Eltern nicht, welche Art erklären kann es sein sollte. Die Eltern würden dann rufen Sie die Delegierten statt des geschützten Verfahrens.

Beachten Sie, dass dies auch weiterhin abgeleiteten Klassen von „Überschreiben“ weiter verhindern würde, was nicht wünschenswert sein kann oder nicht.

Es ist unglaublich gewunden, und ich würde versuchen, es zu vermeiden, wo immer möglich. Wenn Sie wirklich besorgt über sind, was abgeleiteten Klassen tun könnte, würde ich versuchen, die Klasse statt und zwingen Menschen zu versiegeln Zusammensetzung zu verwenden, anstatt der Vererbung. Die Sprache ist nicht wirklich helfen Sie tun, was Sie wollen hier.

Andere Tipps

Als allgemeine Regel OOPS, kann man nicht die Sichtbarkeit eines Elements reduzieren, wenn überschreiben. Also von privaten geschützt gehen ist nicht erlaubt.

Sie können keine Zugriffsebene von virtuellen Methoden in C # ändern. Sie können es neu deklarieren, indem das new Schlüsselwort, aber dies ist ein Neudeklaration, die die bisherige Methode verbirgt, so wird es nicht funktionieren, wie Sie erwarten, wenn Sie mit Objekten zu tun hat, die in deklariert und tatsächlichen Typ unterscheiden, oder wenn Sie regelmäßig Objekte werfen auf eine Basisklasse Art.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top