Frage

Ist es gute Praxis zu lassen abstrakte Klassen Instanzvariablen definieren?

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

Die Unterklasse, ExternalJavaScript.class, würde dann automatisch die Quellvariable bekommen, aber ich fühle mich ist es einfacher, den Code zu lesen, wenn alle Unterklassen selbst die Quelle definieren, statt von Vererbung.

Was ist Ihr Rat?

/ Adam

War es hilfreich?

Lösung

Ich habe gedacht, dass so etwas wie dies wäre viel besser, da Sie eine Variable sind hinzugefügt, warum also nicht der Zugang zu beschränken, und es sauberer machen? Ihre Getter / Setter sollte das tun, was sie sagen, auf dem Zinn.

public abstract class ExternalScript extends Script {

private String source;

public void setSource(String file) {
    source = file;
}

public String getSource() {
    return source;
}

bringen diese auf die Frage zurück, nicht die Mühe Sie jemals Blick auf, wo die Getter / Setter-Code ist, wenn es zu lesen? Wenn sie alle tun bekommen und Einstellung dann brauchen Sie sich keine Sorgen machen über das, was die Funktion ‚bedeutet‘, wenn Sie den Code zu lesen. Es gibt ein paar andere Gründe, etwa zu denken:

  • Wenn Quelle (so zugänglich durch Subklassen) geschützt wurde dann Code wird chaotisch: Wer die Variablen ändert sich? Wenn es ein Objekt, um es dann schwierig wird, wenn Sie brauchen, um Refactoring, während ein Verfahren diesen Schritt leichter machen tendiert.
  • Wenn Ihr Getter / Setter-Methoden sind nicht immer und Einstellung, dann beschreibt sie als etwas anderes.

Denken Sie immer, ob Ihre Klasse wirklich eine andere Sache ist oder nicht, und das soll helfen, zu entscheiden, ob Sie etwas mehr brauchen.

Andere Tipps

Sicher .. Warum nicht?
Abstrakte Basisklassen sind nur Bequemlichkeit Hause Verhalten und Daten gemeinsam zu 2 oder mehrer Klassen an einem einzigen Ort für die Effizienz der Lagerung und Wartung. Es ist ein Implementierungsdetail.
Achten Sie darauf jedoch, dass Sie nicht eine abstrakte Basisklasse verwenden, wo Sie eine Schnittstelle verwenden sollten. Siehe href="https://stackoverflow.com/questions/56867/interface-vs-base-class"> Schnittstelle vs Basisklasse

Natürlich. Die ganze Idee der abstrakten Klassen ist, dass sie ein bestimmtes Verhalten oder Daten enthalten, die Sie alle Unterklassen erfordern zu enthalten. Denken Sie an dem einfachen Beispiel von WheeledVehicle - es hat eine numWheels Membervariable haben soll. Sie möchten, dass alle Unterklassen diese Variable haben. Denken Sie daran, dass abstrakte Klassen sind eine sehr nützliche Funktion, wenn APIs zu entwickeln, wie sie sicherstellen können, dass Menschen, die Ihre API erweitern wird es nicht brechen.

scroll top