Frage

Wenn Sie mehrere Klassen, in denen Sie sie wünschen für gemeinsame Funktionalität von einer Basisklasse erben, sollten Sie die Basisklasse mit einer Klasse oder eine abstrakte Klasse implementieren?

War es hilfreich?

Lösung

Das hängt davon ab, wenn Sie nie dann die Basisklasse in der Lage sein wollen, instanziiert es abstrakt machen. Ansonsten lassen Sie es als eine normale Klasse.

Andere Tipps

Wenn die Basisklasse sein sollte nicht instanziiert dann eine abstrakte Klasse machen -. Wenn die Basisklasse instanziiert werden muss, dann es nicht abstrakt machen

In diesem Beispiel macht es Sinn, die Basisklasse abstrakt zu machen, wie die Basisklasse hat keine konkrete Bedeutung:

abstract class WritingImplement
{
    public abstract void Write();
}

class Pencil : WritingImplement
{
    public override void Write() { }
}

Doch in diesem nächsten Beispiel kann man sehen, wie die Basisklasse konkrete Bedeutung hat:

class Dog
{
    public virtual void Bark() { }
}

class GoldenRetriever : Dog
{
    public override void Bark() { }
}

Alles ziemlich subjektiv wirklich ist -. Sie sollten ein ziemlich gutes Urteil nennen Grundlage treffen können auf die Bedürfnisse Ihrer bestimmten Domain

Es hängt davon ab, macht es Sinn für die Basisklasse in Frage stellt auf seine eigenen existieren, ohne von abgeleitet werden? Wenn die Antwort ja ist, dann sollte es eine reguläre Klasse sein, sonst sollte es eine abstrakte Klasse sein.

Ich schlage vor:

  • Erstellen Sie eine Schnittstelle.
  • Implementieren Sie die Schnittstelle in Ihrer Basisklasse.
  • Machen Sie die Basisklasse eine echte Klasse, nicht abstrakt (siehe unten, warum).

Der Grund, warum ich anstelle von abstrakten Klassen reale Klassen bevorzugen ist, dass abstrakte Klassen können nicht instanziiert werden, die Optionen für die Zukunft begrenzt unnötig . Zum Beispiel, später kann ich den Zustand und die Methoden, die von der Basisklasse bereitgestellt muß aber nicht erben kann und muß nicht die Schnittstelle implementieren; wenn die Basisklasse abstrakt ist, ich bin kein Glück, aber wenn die Basisklasse eine reguläre Klasse ist, dann kann ich eine Instanz der Basisklasse erstellen und sie als Bestandteil meiner anderen Klasse halten, und auf die Instanz delegieren die wiederzuverwenden Zustand / Methoden zur Verfügung gestellt.

Ja, das passiert nicht oft, aber der Punkt ist. So dass die abstrakte Basisklasse diese Art der Wiederverwendung / Lösung verhindert, wenn es keinen Grund, dies zu tun, ist

Nun, wenn die Basisklasse instanziieren irgendwie gefährlich sei, dann ist es abstrakt machen - oder vorzugsweise macht es weniger gefährlich, wenn möglich; -)

Denken Sie daran, wie ein Bankkonto:

Sie können ein generisches abstraktes Basiskonto machen namens „Account“, dies hält grundlegende Informationen wie Kundendaten.

Sie können dann zwei abgeleiteten Klassen namens „SavingAccount“ oder „DebitAccount“, die ihr eigenes spezifisches Verhalten kann von der Basisklasse Verhalten während zugute kommt.

Dies ist eine Situation, wo der Kunde entweder ein Sparkonto oder ein Bankkonto, ein generisches „Konto“ ist nicht erlaubt, da es nicht sehr beliebt ist in der realen Welt hat nur ein Konto keine Beschreibung haben muss.

Wenn Sie ein ähnliches Szenario für Ihre Bedürfnisse erstellen können, abstrakt ist der Weg zu gehen.

Abstrakte Klassen sind für teilweise umgesetzt Klassen.

Für sich allein keinen Sinn, eine Instanz einer abstrakten Klasse zu haben, braucht es abgeleitet werden. Wenn Sie möchten in der Lage sein, die Basisklasse zu schaffen es nicht abstrakt sein kann.

Ich mag abstrakte Klassen als Schnittstellen denken, die haben einige Mitglieder vordefinierte da sie für alle Unterklassen gemeinsam sind.

Denken Sie an dieser eine andere Art und Weise

  

Ist meine eine Basisklasse ein vollständiges Objekt auf seine eigenen?

Wenn die Antwort nein ist, dann macht es abstrakt. Wenn es ja dann wollen Sie wahrscheinlich es eine konkrete Klasse machen.

Ich würde sagen, wenn Sie nicht auf den Aufruf der Basisklasse von selbst planen, die dann sollten Sie es als abstrakte Klasse definiert werden.

Das hängt davon ab, ob Sie die Basisklasse wollen auf eigenem oder nicht umgesetzt werden.

Als eine abstrakte Klasse, können Sie keine Gegenstände daraus machen.

Abstrakte Klassen sind für vordefinierte Funktionen, zum Beispiel -. Wenn kennen das Minimum genaue Verhalten einer Klasse sollte aussetzen, aber nicht, welche Daten sie es verwenden, oder die genaue Umsetzung zu tun

abstract class ADataAccess
{
    abstract public void Save();
}

Normal (nicht abstrakt) Klassen können für ähnliche Dinge groß sein, aber man muss die Umsetzung Besonderheiten kennen, um sie zu schreiben.

public class DataAccess
{
    public void Save()
    {
        if ( _is_new )
        {
            Insert();
        }
        else if ( _is_modified )
        {
            Update();
        }
    }
}

Auch könnten Sie Schnittstellen verwenden (einzeln oder auf Klassen, ob abstrakt oder nicht) die gleiche Art von Prototyp-Definition zu definieren.

interface ISaveable
{
    void Save();
    void Insert();
    void Update();
}

class UserAccount : ISavable
{
    void ISavable.Save() { ... }
    void ISavable.Insert() { ... }
    void ISavable.Update() { ... }
}

Eine weitere Option kann unter Verwendung von Generika wird

class GenDataAccess<T>
{
    public void Save()
    {
        ...
    }
}

All diese Methoden können einen bestimmten Prototyp zu definieren, verwendet werden, für die Klassen mit zu arbeiten. Möglichkeiten, um sicherzustellen, dass Code A B. sprechen Und natürlich codieren können Sie alle oben nach Ihren Wünschen kombinieren. Es gibt keinen definitiven richtigen Weg, aber Ich mag Definition von Schnittstellen und abstrakten Klassen, dann auf die Schnittstellen beziehen. Auf diese Weise beseitigt einige der Gedanken Anforderungen für „Sanitär“ in höheren Level-Klassen, während die maximale Flexibilität zu halten. (Schnittstellen, die die Anforderung wegnimmt von der abstrakten Basisklasse verwendet wird, überlässt es aber als Option).

Ich glaube, dass viele von euch wieder grundlegende OO Klassen resit.

Das grundlegende Prinzip in OOA / OOD ist zu abstrakt abstrakt, bis Sie können nicht nicht mehr abstrakt. Wenn das, was an Ihrem suchen eine Abstraktion ist dann soll es so sein, das ist, was Ihre OOA / OOD Ihnen schon gesagt. Wenn Sie jedoch sitzen fragen, ob „Code“ abstrakt sein sollte oder nicht, dann offensichtlich Sie nicht wissen, was dieser Begriff bedeutet und sollten wieder grundlegende OOA / OOD / OOP gehen lernen: -)

Mehr zu dem Punkt, den Sie Design Patterns und Harmonielehre lernen sollen, dies wird dazu beitragen, mit OO immens Design!

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