‚Abstrakte Klasse‘ im Vergleich zu ‚normalen Klasse‘ für eine wiederverwendbare Bibliothek

StackOverflow https://stackoverflow.com/questions/2807672

Frage

Ich entwickle eine wiederverwendbare Bibliothek und habe abstrakte Klassen war die Erstellung, so kann der Kunde dann von diesem erstrecken.

FRAGE: Gibt es einen Grund in der Tat sollte ich hier eine abstrakte Klasse verwenden als nur eine normale Klasse gegen

Hinweis - haben bereits beschlossen, ich will nicht, Schnittstellen verwenden, wie ich will tatsächlichen Standardmethoden in meiner Bibliothek schließen, damit der Client sie verwenden, nicht den Code schreiben müssen

.

EDIT: Also ich bin für irgendwelche Vorteile fischen kann ich nicht denken. Zum Beispiel, wenn die Bibliothek der Aktualisierung würde von einer abstrakten Klasse lessen Auswirkungen auf dem Client-Code verwenden - ich kann es nicht sehen, nicht in diesem Fall würde?

War es hilfreich?

Lösung

Wenn Sie die Endbenutzer zu vererben Ihre Klassen zwingen wollen, sollte es keinen Grund für die Verwendung sein abstrakt .

Wenn Sie Ihre Klassen vererbbar und leicht erweiterbar machen, verwenden Sie virtuellen auf Ihre Methoden und stellen Sie sicher, dass Sie verwendbar geschützt Konstrukteuren.

Andere Tipps

Die Motivation für die abstrakte Klasse ist es, Kunden zu verlangen, um die Klasse zu überschreiben. Ihre Entscheidung, ob die Klasse abstrakt sein sollte oder nicht, hängt in erster Linie ab, ob die Zusammenfassung ist eine grundlegende Verhalten fehlt, dass nur ein Benutzer der Klasse liefern kann.

Sie können in der Regel sagen Sie Ihre Klasse müssen abstrakt sein, wenn Sie eine Vorlage Methode von einer Art verwenden, wobei „Stecker in das Loch in diesem Verhalten“ er-Klasse die Logik abgeschlossen ist. Wenn Ihre Klasse ohne eine vom Benutzer bereitgestellte Logik nützlich ist, brauchen Sie wahrscheinlich nicht die Klasse abstrakt zu sein.

Als Beispiel kann Frameworks machen in der Regel nicht, Entscheidungen im Namen ihrer Nutzer in Bezug auf die Dinge wie Objektzustand Validierung, Drucken, Anzeige und so weiter, und sie würden von den Kunden auf konkrete Implementierungen defer müssen.

Klingt wie Sie ein wenig verwirrt über den Unterschied zwischen einer virtuellen Methode und einer abstrakten Klasse sind. Sie brauchen nicht Ihre Klasse als abstrakt zu markieren, wenn Sie feststellen, dass es keinen Sinn macht, auf sie selbst ist. Dies ist nützlich, in Bereichen, in denen Sie Verhalten zwischen mehreren Klassen geteilt haben könnten.

Sounds für mich wie Sie brauchen nur eine reguläre Klasse und einige Methoden, die virtuell sind.

Der Unterschied zwischen einer abstrakten Klasse und einer nicht abstrakt ist, dass Sie nicht die ehemaligen instanziieren und es muss in den überschriebenen. Es ist wirklich an Ihnen zu bestimmen, ob eine Instanz der Basisklasse Sinn für sich allein macht.

Lassen Sie mich Ihnen zwei Fälle. Eine davon ist, wo abstrakte Klasse macht Sinn, und eine, wo es nicht.

public abstract class Animal {
  public string Name {get;set;}
}

public class Dog : Animal {
  public Bark(){}
}

public class Cat : Animal {
  public Meaow(){}
}

In diesem Szenario haben wir eine gemeinsame Basis Animal die Implementierung für Name Eigenschaft zur Verfügung stellt. Es macht keinen Sinn zu instantiate Tier von selbst, da es keine Tiere in der Welt sind, die nur Tiere sind, sie sonst verwelken Hunde oder Katzen oder etwas sind.

Hier ist ein Fall, in dem es sinnvoll, eine nicht-abstrakte Basis haben macht.

class Path {
  public Path(IList<Point> points) {
    this.Points = new ReadOnlyCollection<Point>(points);
  }
  public ReadOnlyCollection<Point> Points {get;}
}

class RectanglePath : Path{
  public SquarePath (Point origin, int height, int width) : 
   base(new List<Point>{origin, new Point(origin.X + width, point.Y}, ....){

  }
}

Hier Pfad, das macht Sinn nicht subclassed ist, können wir jede beliebige Form erstellen, aber es könnte bequemer sein, eine sublass für spezifischere Formen zu verwenden.

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