Gibt es eine Möglichkeit zu machen, eine Methode, die nicht Abstrakt, sondern muss überschrieben werden?
Gibt es eine Möglichkeit zu zwingen, Kind-Klassen zu überschreiben einer nicht-abstrakten Methode der super-Klasse?
Ich muss in der Lage sein zu erstellen, die Instanzen der übergeordneten Klasse, aber wenn eine Klasse erweitert diese Klasse, muss es eine eigene definition von einigen Methoden.
- Ich bemerkte, gab es einen down-vote. Ich Nie Verstand, aber bitte auch erklären, warum der down-vote.
- Wenn eine Methode ist nicht Abstrakt und es hat eine bereitgestellte Implementierung. Wenn es hatte vorgesehen, die Umsetzung war aber "abstract" die bereitgestellte Implementierung würde nutzlos sein, wie es wäre, verworfen werden, indem die überschreibung. Also warum sollte Sie das wollen?
- Ich erwähnte in der Frage, dass ich in der Lage sein müssen, zu erstellen, die Instanzen der übergeordneten Klasse auch. Wie Eltern p=new Parent(); Aber wenn eine Methode in der Übergeordneten Klasse ist Abstrakt, dann kann ich nicht tun.... Das ist der springende Punkt.
- Immer noch, ohne zu sehen, ein Beispiel ich bin nicht den Kauf der "Unterklassen überschreiben muss dieses" Teil. Was ist, wenn Sie Unterklasse Eltern, etwas zu ändern, die nichts mit dieser Methode?
- Wie es scheint, Wartung wehe warten, um zu geschehen. In Fällen, in denen Kinder sind, müssen eine andere Implementierung der Methode aus der Basisklasse, die die Definition einer Schnittstelle und das abstrakte Basis-Klasse eine exception zu werfen geeignet ist. Wenn Sie erwarten, dass Ihre konkrete Klasse zu Unterklassen, Ihr design ist wahrscheinlich suboptimal. Siehe das Open-Closed-Prinzip.
- Sie sind Recht 'Wartung' Sache. Aber immer noch könnte es ein Szenario, in dem Sie gehen zu müssen, dieses Ding.
- Sprechen in hypotheticals alles möglich macht. Gegeben ein konkretes Szenario, es gibt wahrscheinlich eine elegantere/bessere Weg, es zu tun, die nicht die dies.
- Sie können die Superklasse " - Methode zum auslösen einer RuntimeException, dann werden Sie zumindest wissen, dass Sie hatte, um es zu überschreiben bei der Prüfung.
- wie sieht dieser Ungehorsam, der Offen/Geschlossen-Prinzip? Ich weiß sowieso nicht sehen dies nicht so, da die clients der Elternklasse wird in der Lage sein zu halten mit Parent-Klasse. Neu hinzugefügte Klassen wird sich nicht ändern die Quell-oder Binärdateien, die von der Übergeordneten Klasse. Ich weiß nicht, was du redest.
- scheint, wie Sie don ' T haben eine Antwort. Und verwendet den Begriff Open-Geschlossen-Prinzip nur in der Aufregung zu wissen, ein mehr Begriff. lol
- Mit der Vererbung schafft eine situation, wo Sie erzwingen eine enge Kopplung zwischen zwei Objekten. Dies wird oft als das "fragile base class problem". Du bist wahrscheinlich zu haben, um ändern Sie die Basisklasse, wenn Sie eine Unterklasse würde gebrochen werden durch eine schlechte Annahme durch die Basis. Josh Bloch spricht über diese in seinen Guten API-design sprechen und wie Java hast es falsch. youtube.com/watch?v=aAb7hSCtvGw#t=2600
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine direkte compiler erzwungene Weg, dies zu tun, soweit ich weiß.
Könnte man umgehen, indem man nicht machen die Eltern instanziierbaren Klasse, sondern bietet eine factory-Methode erstellt eine Instanz von einem (möglichst private) - Unterklasse, hat die default-Implementierung:
Du nicht schreiben
new Base()
jetzt, aber Sie tun könnenBase.create()
um die default-Implementierung.super.frobincate()
da eine untergeordnete Klasse erbtBase
und nichtDefaultBase
. Ansonsten, das ist eine große Arbeit-rund, denke ich.Wie andere haben darauf hingewiesen, können Sie dies nicht direkt.
Aber ein Weg dies zu tun ist die Verwendung der Strategie-Muster, etwa so:
Sollten Sie eine Schnittstelle mit dieser Methode. Klasse, Nachkommen haben, um es zu implementieren.
Ich denke, die einfachste Möglichkeit ist das erstellen einer abstrakten Klasse erbt von der Basis-Klasse:
Nein, das ist der ganze Sinn einer abstrakten Methode. Was ist dein Anwendungsfall? Vielleicht können wir darüber nachdenken, es basiert auf dem zugrunde liegenden Bedarf.
Wie etwa dieser: in der default-Implementierung der Methode, reflektion verwenden, um die genaue Klasse des Objekts. Wenn die Klasse nicht mit Ihren Basis-Klasse genau das werfen einer RuntimeException oder gleichwertig.
super
Umsetzung, widrigenfalls eine runtime-exception geworfen wird.Es gibt eine Grund es ist nicht möglich!
Die abgeleitete Klasse könnte einfach nennen der Basisklasse Implementierung beim überschreiben der Methode.
Also, was ist der Punkt zu zwingen, die Klasse zu überschreiben, Ihre Methode? Ich glaube nicht, dass es irgendeinen nutzen.
if (false) super.Foo();
?Antwort wäre keine. Sie können die redesign-mit Vorlage-design-Muster. Es kann Ihnen dabei helfen.
Alternativ, Sie können Ihr Kind-Klassen implementieren eine Schnittstelle. Das interface kann oder kann nicht umgesetzt werden, durch die super-Klasse.
Können Sie immer die Basisklasse eine Methode, die eine exception wirft.
Technisch ist die base-Klasse definiert die Methode, aber es ist nicht benutzbar ohne überschreiben der Methode. In einem solchen Fall bevorzuge ich eine runtime-Ausnahme, da Sie nicht erfordern eine explizite Aussage wirft. Ein Beispiel folgt
Der Nachteil ist, dass dies nicht verhindern, die Schaffung von
Base
Objekte; aber jeder Versuch, eine der "muss überschrieben werden" - Methoden, wird bald finden, dass Sie überschrieben haben, die Klasse.Während diese Lösung erfüllt die Beschreibung der Anfrage sowie Ihre Anwendung würde wahrscheinlich profitieren Sie von nicht die eine Lösung wie dieser. Es ist viel besser, zu vermeiden, Laufzeit stürzt mit compiler prüft, welche der abstract-Schlüsselwort enthält.
Ich wird Spiegel der anderen Antworten und sagen, dass es keine compiler-durchgesetzt zwingen, die abgeleiteten Klassen zu überschreiben einer nicht-abstrakten Methode. Der ganze Sinn machen, eine Methode Abstrakt ist, zu definieren, dass eine Methode mit dieser Signatur muss vorhanden sein, aber kann nicht angegeben werden, auf dem Basis-level und muss daher angegeben werden, bei der eine abgeleitete Ebene. Wenn es eine funktionierende, nicht-triviale Implementierung (wie in es nicht leer ist und nicht nur eine Ausnahme werfen, oder zeigen Sie eine Nachricht), der eine Methode auf der Basis-Ebene, dann ist dies nicht unbedingt erforderlich ist, um für einen Aufruf der Methode, die von einem Verbraucher der abgeleiteten Klasse um erfolgreich zu sein. So, der compiler nicht haben durchsetzen überschreiben einer Methode, die ausgeführt werden können, die Recht erfolgreich auf entweder die Basis-oder abgeleiteten Ebenen.
In Situationen, In denen Sie möchten, einer abgeleiteten Klasse zu überschreiben Ihrer Umsetzung arbeiten, es sollte ziemlich offensichtlich, dass die Basis-Implementierung nicht tun, was der abgeleiteten Klasse werden die Verbraucher wollen; die Basisklasse entweder nicht genug die Umsetzung, oder die falsche. In diesen Fällen müssen Sie darauf Vertrauen, dass ein Programmierer die sich aus Ihrer Klasse wissen, was er tut, und er somit weiß, dass die Methode muss überschrieben werden, weil Sie nicht produzieren die richtige Antwort im Zusammenhang mit seiner neuen Objekt.
Ich denken kann, eine Sache, die Sie tun konnte. Es würde eine abstrakte Basisklasse, mit einem geschlossenen (final für die Javaheads) "default" - Implementierung. So, es ist eine grundlegende Implementierung der Methode, die leicht verfügbar sind zu verwenden, als ob es eine "Basis" - Klasse, aber um zu definieren, eine andere Klasse für ein neues Szenario, müssen Sie gehen Sie zurück zu der abstrakten Klasse, und sind daher gezwungen, implementieren Sie die Methode. Diese Methode könnte sein, die nur abstrakte Sache auf die Klasse, also noch so dass Sie machen verwenden von basic-Implementierungen von anderen Methoden:
Dies hat jedoch zwei Nachteile. Erstens, weil Sie keinen Zugang zu DefaultClass Implementierung durch Vererbung, Sie kann nicht erweitert DefaultClass der Umsetzung, was bedeutet, dass zu tun, was DefaultClass tut, plus ein wenig mehr, Sie müssen schreiben Sie den code aus DefaultClass, verletzen TROCKNEN. Zweitens, das funktioniert nur für eine Ebene der Vererbung, da kann man nicht erzwingen überschreiben, wenn Sie erlauben die Vererbung von DerivedClass.
vielleicht hilft dies ja:
ok, lasst uns lernen, es auf diese Weise. Ich bin java-Stil-Richtlinien und verwenden java-syntax. So wird davon ausgegangen, dass mehrere erbschaft-und C++ - Vorlagen sind nicht verfügbar.
machen die übergeordnete Klasse Methode abstract ist nicht ein muss,
in OOP verwenden Sie das Konzept des Polymorphismus. Sie können dieselbe Methode verwenden, die in zwei oder mehr verschiedene Arten.
Dies wird als Methode überschreiben.
nehmen wir ein Beispiel.
diese wird print "meowww !!!" auf dem Bildschirm.
aber dies bedeutet nicht, dass die Methode makeSound muss überschrieben werden in der Kind-Klasse.
Wenn Sie die Kind-Klasse gezwungen werden, überschreiben die Methoden, die Sie besser implementieren einer Schnittstelle durch die Klasse.
wird diese auch " drucken "meowwww !!!" auf dem Bildschirm
Kann es nicht empfohlen wird, können Sie werfen eine Ausnahme( so etwas wie MethodeMustBeOverRiddenExp) in Ihre methode der Umsetzung.
Natürlich ist es Laufzeit zwingen, aber vielleicht besser als nuthing.