Abstrakte Variablen in Java?



Answers

Definieren Sie einen Konstruktor in der abstrakten Klasse, der das Feld so einstellt, dass die konkreten Implementierungen gemäß der Spezifikation ausgeführt werden, die zum Aufrufen / Überschreiben des Konstruktors erforderlich ist.

Z.B

public abstract class AbstractTable {
    protected String name;

    public AbstractTable(String name) {
        this.name = name;
    }
}

Wenn Sie AbstractTable , wird die Klasse erst kompiliert, wenn Sie einen Konstruktor hinzufügen, der super("somename") .

public class ConcreteTable extends AbstractTable {
    private static final String NAME = "concreteTable";

    public ConcreteTable() {
        super(NAME);
    }
}

Auf diese Weise müssen die Implementierer den name festlegen. Auf diese Weise können Sie auch den Konstruktor der abstrakten Klasse (null) überprüfen, um ihn robuster zu machen. Z.B:

public AbstractTable(String name) {
    if (name == null) throw new NullPointerException("Name may not be null");
    this.name = name;
}
Question

Ich komme aus c #, wo das einfach und möglich war.

Ich habe diesen Code:

public abstract class clsAbstractTable {

    public abstract String TAG;
    public abstract void init();

}

aber Eclipse sagt mir, dass ich einen illegalen Modifikator verwende.

Ich habe diese Klasse:

public class clsContactGroups extends clsAbstractTable {


}

Ich möchte die Variable und Methode so definieren, dass Eclipse mich auffordert, ich habe abstrakte Variablen und Methoden nicht implementiert.

Wie muss ich meine abstrakte Klasse definieren, damit ich aufgefordert werde, die Abstracts zu implementieren?

BEARBEITEN 1

Ich werde verschiedene Klassen für verschiedene DB-Tabellen erstellen. Jede Klasse sollte ihre eigene TABLENAME-Variable haben, keine Ausnahme. Ich muss sicherstellen, dass diese Variable jedes Mal statisch ist, wenn ich eine neue Klasse erstelle, die die abstrakte Klasse erweitert.

Dann werde ich in der abstrakten Klasse eine Methode haben, zB: init ();

Wenn ich in dieser init () -Methode TABLENAME aufruft, sollte es den Wert aus der Unterklasse nehmen.

so etwas sollte auch funktionieren

String tablename=(clsAbstract)objItem.TABLENAME;
// where objItem can be any class that extended clsAbstract;

BEARBEITEN 2

Ich möchte eine Konstante (statisch) in jeder Klasse definiert haben, deren Name abstrakt definiert ist.

  • Ich definiere die Variable TABLENAME in abstract, aber keinen Wert angegeben.
  • Ich erstelle eine clsContactGroups, ich sollte aufgefordert werden, TABLENAME zu implementieren, hier werden einige Daten abgerufen. zB: TABLENAME = "Kontaktgruppen";
  • Ich erstelle eine zweite Klasse clsContacts, ich sollte aufgefordert werden, TABLENAME zu implementieren, hier werden einige Daten abgerufen. zB: TABLENAME = "Kontakte";
    etc...



Es gibt 2 Möglichkeiten, abstrakte Eigenschaften in Java zu definieren, ohne eine Eigenschaft als abstrakt zu kennzeichnen .

1. Möglichkeit: Definieren Sie einen parametrisierten Konstruktor in der abstrakten Klasse, etwa so:

public abstract class clsAbstractTable {
       private String TAG;
       public clsAbstractTable (String TAG) {
            this.TAG= TAG;
       }
}

Wenn ein parametrisierter Konstruktor in einer abstrakten Klasse definiert wird, müssen die Unterklassen ihre eigenen Konstruktoren definieren und den Superkonstruktor aufrufen, wodurch sie ihren eigenen TAG übergeben .

2. Weg: Definieren Sie die Eigenschaft als Getter-Methode, etwa wie folgt:

public abstract class clsAbstractTable {
    public abstract String getTAG();
}

Auf diese Weise wird der Wert der TAG- Eigenschaft delegiert, um von jeder konkreten Klasse definiert zu werden.

Quelle: Definieren Sie eine abstrakte Eigenschaft in Java




Da es keine Implementierung einer Variablen gibt, kann sie nicht abstrakt sein;)




Fügen Sie diese Methode einfach zur Basisklasse hinzu

public abstract class clsAbstractTable {

    public abstract String getTAG();
    public abstract void init();

}

Nun sollte jede Klasse, die die Basisklasse erweitert (und nicht abstrakt sein will), einen TAG bereitstellen

Sie könnten auch mit BalusCs Antwort gehen




Ändern Sie den Code in:

public abstract class clsAbstractTable {
  protected String TAG;
  public abstract void init();
}

public class clsContactGroups extends clsAbstractTable {
  public String doSomething() {
    return TAG + "<something else>";
  }
}

Auf diese Weise haben alle Klassen, die diese Klasse erben, diese Variable. Sie können 200 Unterklassen machen, und trotzdem hat jede von ihnen diese Variable.

Randnotiz: Verwenden Sie CAPS nicht als Variablennamen; Allgemein gilt, dass sich alle Großbuchstabenbezeichner auf Konstanten beziehen, dh auf nicht veränderbare Datenstücke.




Related