Ich rieche hier einen Code Geruch. Ich bin der Meinung, dass Sie nur eine Basisklasse erben sollten, wenn Sie die gesamte Funktionalität dieser Basisklasse implementieren. Was Sie tun, repräsentiert nicht wirklich objektorientierte Prinzipien. Wenn Sie also von Ihrer Basis erben möchten, sollten Sie Name implementieren, andernfalls haben Sie Ihre Vererbung falsch herum. Ihre Klasse A sollte Ihre Basisklasse sein und Ihre aktuelle Basisklasse sollte von A erben, wenn Sie das wollen und nicht umgekehrt.
Allerdings nicht zu weit von der direkten Frage zu verirren. Wenn Sie haben wollen „die Regeln“ hinwegsetzen und auf dem Weg fortsetzen möchten Sie gewählt haben - hier ist, wie Sie es gehen kann:
Die Konvention ist die Eigenschaft zu implementieren, sondern eine NotImplementedException werfen, wenn diese Eigenschaft heißt - obwohl ich das auch nicht mag. Aber das ist meine persönliche Meinung und ändert nichts daran, dass diese Konvention noch immer besteht.
Wenn Sie veraltete die Eigenschaft versucht sind (und es ist in der Basisklasse als virtuelle deklariert), dann können Sie entweder das Obsolete-Attribut auf sie aus:
[Obsolete("This property has been deprecated and should no longer be used.", true)]
public override string Name
{
get
{
return base.Name;
}
set
{
base.Name = value;
}
}
(Edit: Als Brian In den Kommentaren wird darauf hingewiesen, dass der zweite Parameter des Attributs einen Compilerfehler verursacht, wenn jemand die Name-Eigenschaft referenziert. Daher können sie ihn nicht verwenden, obwohl Sie ihn in der abgeleiteten Klasse implementiert haben.)
Oder wie ich erwähnte NotImplementedException verwenden:
public override string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
Wenn jedoch die Eigenschaft nicht als virtuelle deklariert ist, dann können Sie das neue Schlüsselwort verwenden, um es zu ersetzen:
public new string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
Sie können das Obsolete-Attribut auf die gleiche Weise verwenden, wie Wenn die Methode überschrieben wurde, oder Sie die NotImplementedException auslösen können, je nachdem, was Sie wählen. Ich würde wahrscheinlich verwenden:
[Obsolete("Don't use this", true)]
public override string Name { get; set; }
oder:
[Obsolete("Don't use this", true)]
public new string Name { get; set; }
Je nachdem, ob es nicht als virtuelle in der Basisklasse deklariert wurde.
Dies ist eine Verletzung eines der Grundprinzipien von OOP (Polymorphismus und, verwandt, das 'L' in SOLID). – jason
Speziell eine Verletzung des Liskow-Substitutionsprinzips (http://en.wikipedia.org/wiki/Liskov_substitution_principle) –
Viele der Antworten ignorieren die einfache Tatsache, dass eine Basisklasse von einer dritten Partei bereitgestellt werden kann. Da dieser Code nicht gehört, kann er nicht geändert werden. Es gibt eine definitive Gültigkeit, eine engere Version der Basisklasse durch Ausblenden von Mitgliedern erstellen zu wollen. Und es ist schöner, zu erben, als das Basis-Steuerelement als Komponente eines neuen Steuerelements zu verwenden, da dies viel zusätzliche Arbeit erfordert, um Methoden zu offenbaren, die bereits auf der Basis gefunden wurden. – Mario