Frage

ich mit einer großen Code-Basis zu tun habe, die eine Menge von Klassen und viele abstrakten Methoden auf diesen Klassen hat. Ich interessiere mich für Völker Meinungen über das, was ich in der folgenden Situation tun soll.

Wenn ich eine Klasse Eltern-A mit einer abstrakten Methode habe. Es wird nur zwei Kinder. Wenn Child-B AbstractMethodA implementiert aber Child-B nicht, wie es gelten tut.

Soll ich

  1. Entfernen Sie das Schlüsselwort abstract von den Eltern und verwenden virtuell oder dynamisch?
  2. Geben Sie eine leere Implementierung des Verfahrens.
  3. eine Implementierung bereitzustellen, die einen Fehler auslöst, wenn genannt.
  4. Ignorieren Sie die Warnung.

Edit: Danke für alle Antworten. Es bestätigte meinen Verdacht, dass dies nicht passieren. Nach einer weiteren Untersuchung stellt sich die Methoden aus wurden verwendet, gar nicht so habe ich sie ganz entfernt werden.

War es hilfreich?

Lösung

Wenn AbstractMethodA gilt nicht für Kinder B, dann Child-B sollte nicht von Eltern-A erbt sein.

oder die Kontra zu nehmen, wenn Child-B von Eltern-A erbt, und AbstractMethodA gilt nicht für das Kind, dann sollte es auch nicht in der Mutter sein.

Durch ein Verfahren, in Parent-A setzen, Sie sagen, dass das Verfahren gilt für Eltern-A und alle seine Kinder. Das ist, was Vererbung bedeutet , und wenn Sie es verwenden, um etwas anderes bedeuten, werden Sie in einem ernsten Streit mit Ihrem Compiler beenden.

[Bearbeiten - das sagte Antwort Mladen Prajdic das ist in Ordnung, wenn die Methode keine Anwendung findet, sollte aber nichts für eine oder mehrere der beteiligten Klassen tun. Ein Verfahren, das nichts tut, ist IMO nicht dasselbe wie ein Verfahren, das nicht anwendbar ist, aber vielleicht meinen wir nicht die gleiche Sache durch „gilt nicht“]

Eine andere Technik ist das Verfahren in Child-B wie auch immer, zu implementieren, aber es ist etwas drastisch zu tun haben wie immer eine Fehlermeldung erscheint, oder eine Ausnahme auslösen, oder so etwas. Es funktioniert, sollte aber als ein bisschen ein bodge lichend und nicht als ein klares Design, da es bedeutet, dass Anrufer wissen müssen, dass das, was sie haben, dass sie als Eltern-A sind zu behandeln, ist wirklich ein Kind-B und daher sollten sie AbstractMethodA nicht nennen. Im Grunde genommen haben Sie Polymorphismus verworfen, was der Hauptvorteil der OO Vererbung ist. Persönlich über ziehe ich es auf diese Weise tun, in der Basisklasse eine Ausnahme werfenden Implementierung mit, denn dann kann ein Kind Klasse nicht „versehentlich“ verhalten schlecht durch „Vergessen“, das Verfahren überhaupt zu implementieren. Es hat sie umzusetzen, und wenn es implementiert es dann nicht funktioniert, ist es so explizit der Fall ist. Eine schlechte Situation sollte laut sein.

Andere Tipps

Wenn die Umsetzung in Nachkomme ist nicht zwingend erforderlich, dann sollten Sie für 1 + 2 (das heißt leere virtuelle Methode in Vorfahren) gehen

Ich denke, dass im Allgemeinen, sollten Sie nicht von der abstrakten Klasse erben, wenn Sie nicht alle abstrakten Methoden in erster Linie zu implementieren, aber ich verstehe, dass es einige Situationen, in denen es macht immer noch senseto zu tun (siehe die Stream-Klasse und ihre Implementierungen).

Ich denke, Sie sollten nur Implementierungen dieser abstrakten Methoden erstellen, die eine NotImplementedException werfen.

Sie können auch mit ObsoleteAttribute versuchen so, dass diese bestimmte Methode aufrufen eine Kompilierung Fehler wäre (oben auf NotImplementedException natürlich werfen). Beachten Sie, dass ObsoleteAttribute nicht ganz verstanden, die für diese verwendet werden, aber ich denke, wenn man eine aussagekräftige Fehlermeldung mit Kommentaren zu verwenden, es ist in Ordnung.

obligatorisches Codebeispiel:

[Obsolete("This class does not implement this method", true)]
public override string MyReallyImportantMethod()
{
    throw new NotImplementedException("This class does not implement this method.");
}

es leer in Basisklasse virtuell machen und es bei Kindern außer Kraft setzen.

Sie könnten Schnittstellen verwenden. Dann Child-A und Child-B können sowohl verschiedene Methoden implementieren und erben noch von Eltern-A. Schnittstellen arbeiten wie abstrakte Methoden, dass sie die Klasse zwingen, sie zu implementieren.

Wenn einige Unterklassen (B1, B2, ...) von A sind, für eine andere Teilmenge seiner Methoden verwendet als andere (C1, C2, ...), so könnte man sagen, dass A in B und C aufgeteilt werden, .

Ich weiß, dass Delphi nicht allzu gut (überhaupt nicht :)), aber ich dachte, dass genau wie z.B. in Java und COM kann eine Klasse ‚implementieren‘ mehrere Schnittstellen. In C ++ kann dies nur durch mehrfach erben abstrakte Klassen erreicht werden.

Konkretere: würde ich zwei abstrakte Klassen erstellen (mit abstrakten Methoden) und den Vererbungsbaum ändern

.

Wenn das nicht möglich ist, eine Abhilfe könnte einen „Adapter“ sein: eine Zwischenklasse A_nonB_ mit allen B-Methoden leer implementiert (und eine Warnung Nachgeben auf Anruf) und A_nonC_. Dann das Erbe ändern Baum Ihr Problem zu lösen. B1, B2, ... erbt von A_nonC_ und C1, C2, ... erben von A_NonB _

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