java abstract - Abstrakte Variablen in Java?




6 Answers

Ich denke, Ihre Verwirrung ist mit C # -Eigenschaften gegenüber Feldern / Variablen. In C # können Sie abstrakte Felder auch in einer abstrakten Klasse nicht definieren. Sie können jedoch abstrakte Eigenschaften definieren, da diese Methoden effektiv sind (zB kompiliert nach get_TAG() und set_TAG(...) ).

Manche haben daran erinnert, dass Sie niemals öffentliche Felder / Variablen in Ihren Klassen haben sollten, nicht einmal in C #. Mehrere Antworten haben angedeutet, was ich empfehlen würde, haben es aber nicht klargestellt. Sie sollten Ihre Idee mit Hilfe von getTAG () in Java als JavaBean-Eigenschaft übersetzen. Dann müssen Ihre Unterklassen dies implementieren (ich habe auch ein Projekt mit Tabellenklassen geschrieben, die dies tun).

So können Sie eine abstrakte Klasse wie diese definiert haben ...

public abstract class AbstractTable {

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

    ...
}

Dann müssten Sie in jeder konkreten Unterklasse eine statische endgültige Variable (Konstante) definieren und diese von getTag() , etwa so:

public class SalesTable extends AbstractTable {

    private static final String TABLE_NAME = "Sales";

    public String getTag() {
        return TABLE_NAME;
    }

    public void init() {
        ...
        String tableName = getTag();
        ...
    }

}

EDIT :

Sie können geerbte Felder (in C # oder Java) nicht überschreiben. Sie können statische Elemente auch nicht außer Kraft setzen, unabhängig davon, ob es sich um Felder oder Methoden handelt. Das ist also auch die beste Lösung dafür. Ich habe mein oben genanntes Init-Methoden-Beispiel geändert, um zu zeigen, wie das verwendet werden würde - wieder denke an die getXXX-Methode als Eigenschaft.

class vs

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...



Keine abstrakten Variablen in Java (oder C ++).

Wenn die übergeordnete Klasse eine Variable hat und eine untergeordnete Klasse das übergeordnete Element erweitert, muss das untergeordnete Element die Variable nicht implementieren. Es benötigt nur Zugriff auf die Instanz des Elterns. Entweder get / set oder geschützter Zugriff reicht aus.

"... also sollte ich aufgefordert werden, die Abstracts zu implementieren"? Wenn Sie eine abstrakte Klasse erweitern und eine abstrakte Methode nicht implementieren können, fordert der Compiler Sie entweder auf, sie zu implementieren oder die Unterklasse als abstrakt zu markieren. Das ist die einzige Aufforderung, die du bekommen wirst.




Das Beste, was Sie tun können, ist Accessoren / Mutatoren für die Variable.
So etwas wie getTAG ()
Auf diese Weise müssten alle implementierenden Klassen sie implementieren.

Abstrakte Klassen werden verwendet, um abstraktes Verhalten und nicht Daten zu definieren.




Warum möchten Sie, dass alle Unterklassen die Variable definieren? Wenn jede Unterklasse es haben soll, definiere es einfach in der Oberklasse. Übrigens, da es eine gute OOP-Praxis ist, Felder sowieso nicht zu exponieren, macht Ihre Frage noch weniger Sinn.




Um Metadaten pro Klasse hinzuzufügen, ist möglicherweise eine Anmerkung der richtige Weg.

Sie können jedoch das Vorhandensein einer Anmerkung in der Schnittstelle nicht erzwingen, so wie Sie statische Elemente oder das Vorhandensein eines bestimmten Konstruktors nicht erzwingen können.




Nein, Java unterstützt keine abstrakten Variablen. Es macht auch nicht viel Sinn.

Welche spezifische Änderung der "Implementierung" einer Variablen erwarten Sie von einer Unterklasse?

Wenn ich eine abstract String Variable in der Basisklasse habe, was sollte die Subklasse tun, um sie nicht-abstrakt zu machen?




Related

java class variables abstract