Ist dort Weg für eine Klasse zu 'entfernen' Methoden, die es geerbt hat?
Ist es Weg für eine Klasse zu 'entfernen' Methoden, die es geerbt hat?
E. g. wenn ich nicht möchte, dass meine Klasse ToString()
Methode kann ich etwas tun, so dass es nicht mehr verfügbar ist?
- codinghorror.com/blog/2004/08/inherits-nothing.html
- Dies ist bekannt als die "Refused Bequest" code smell: "eine Klasse, überschreibt eine Methode der Basisklasse in einer solchen Weise, dass der Vertrag von der Basis-Klasse wird nicht geehrt durch die abgeleitete Klasse". en.wikipedia.org/wiki/Code_smell
- Es gibt keine Möglichkeit zum entfernen einer Methode. Wenn die Methode
virtual
(markiert mitvirtual
,abstract
oderoverride
), haben Sie Glück, weil der Autor von der Basisklasse erlaubt Ihnen zu entscheiden, das Verhalten der Methode. Man konnte es nichts zu tun, oder werfen eine Ausnahme (aber beachten Sie, dass diese brechen könnte die Basisklasse Erwartung, von Ihrer Methode, so würde es zu Problemen führen, in einigen Fällen). Wenn die Methode ist nicht virtuell, Sie können nicht viel tun. Verstecken Sie es mit einer anderen Methode ist eine sehr schlechte Idee (und nicht entfernen Sie es natürlich).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein - das würde gegen Liskov ' s substitutionsprinzip. Sie sollten immer in der Lage, verwenden Sie eine Instanz von einem Untertyp, als ob es eine Instanz eines supertyps.
Vergessen Sie nicht, dass ein Anrufer kann nur bewusst sein, Ihre Art "als" Basis-Typ oder eine Schnittstelle. Betrachten Sie diesen code:
Haben würde, um zu kompilieren, wäre es nicht? Was würden Sie jetzt erwarten, dass passiert bei der Ausführung?
Nun für
ToString
,GetHashCode
,Equals
undGetType
es gibt keinen Weg, um zu vermeiden, dass Sie in den ersten Platz - aber in der Regel, wenn es gibt Methoden, die Sie möchten, auf "remove" von einer Basis geben, die vermuten lässt, dass Sie sollten nicht Erben es in den ersten Platz. Persönlich finde ich die Rolle der Vererbung ist etwas übertreiben in der Objekt-orientierten Programmierung: wo ist es sinnvoll es wirklich nützlich, aber im Allgemeinen bevorzuge ich die Komposition über Vererbung und Schnittstellen als eine form der Abstraktion eher als Basisklassen.ToString()
Methode eine Ausnahme werfen. Es gibt eine Menge mehr in hidden Verwendungen vonToString()
als die, die Sie zeigten (Aufruf direkt).new
modifier ausblenden eines geerbten Mitglieds (und löst eine NotSupportedException aus, wie tanascius vorgeschlagen), ohne irgendwelche Prinzipien oder werfen unerwartete Ausnahmen.ToString()
Aufruf eine exception wirft ...ToString()
. Sagen wir, Sie habenBall
Klasse, die eine virtuelleBounce()
Methode verwendet, die eine virtuelleBounceHeight
- Eigenschaft, um zu arbeiten. Wenn Sie eineConcreteBall
Klasse, könnte man das überschreiben derBounceHeight
Eigenschaft und geben 0 zurück, währendnew
-ing dieBounce()
- Methode und werfen einenNotSupportedException
. So dass, wenn Sie eineBall
Verweis auf eineConcreteBall
ObjektBounce()
wird nicht werfen aber keinen Effekt haben wird (wie erwartet), während die aufrufendeBounce()
auf einen Verweis aufConcreteBall
werfen und informativ sein (wie erwartet).Stream
Klasse, woSeek
(und die anderen Methoden und Eigenschaften) werfenNotSupportedException
wenn die konkrete Implementierung nicht unterstützt. Jon, ich Stimme zu, die Regel ist dies nicht die beste Idee (für Strom, würde ich gegangen für ISeekableStream, IWriteableStream, etc), aber mein Hauptpunkt ist, dass ich glaube nicht, dass die Antwort auf die OP-Frage ist ein straight-up 'Nein'.Können Sie werfen eine NotSupportedException aus, markieren Sie es als Veraltet und verwenden EditorBrowsable:
EDIT:
Wie von anderen darauf hingewiesen: ich beschreibe einen Weg, um "deaktivieren" Methoden, aber Sie haben zu denken, sorgfältig, wo Sie wollen, um diese zu verwenden. Vor allem das werfen von Ausnahmen kann eine sehr gefährliche Sache.
[Obsolete( "...", true )]
? Dann der Aufruf der Methode zu einem compiler-Fehler, keine Ausnahme erforderlich.IsError
Eigentum der ObsoleteAttribute. WennIsError
isttrue
generiert der compiler einen Fehler, und wennfalse
eine Warnung.Als andere wies darauf hin, Sie können nicht "remove" Methode, aber wenn Sie fühlen, dass es Unrecht zugefügt hat, Sie in irgendeiner Weise können Sie ausblenden in der abgeleiteten Klasse.
Aus der Dokumentation von Microsoft (jetzt im Ruhestand):
Kurze awnser, NICHT alle Klassen Erben von object und object hat diese Methode.