2013-02-22 3 views
15

Ich entwickle mich in Android und habe eine relativ einfache Situation, die ich versuche, in der bestmöglichen Weise zu implementieren.Force-Unterklassen zum Setzen einer Variablen in Java

Einfach, ich habe eine Klasse, die alle grundlegenden Parameter für einen bestimmten Bildschirm definiert. Von hier aus ist jeder Bildschirm in der Anwendung eine Unterklasse davon. Ich brauche alle Bildschirm (d. H. Unterklasse), um den Wert einer Variablen in seiner Implementierung (das heißt, jeder Bildschirm muss definieren, welche Ebene es in einem Navigationsbaum ist).

Auch sollte idealerweise diese Variable final sein, wenn es in den Unterklassen eingestellt ist (ich realisiere, dass dies wahrscheinlich nicht möglich ist).

Was ist der beste Weg, um darüber zu gehen? Gibt es eine Möglichkeit, dieses Verhalten in Java korrekt zu erzwingen?

+3

Dies kann nicht mit einer Variablen erfolgen. Eine abstrakte Klasse kann jedoch erfordern, dass eine bestimmte Methode implementiert wird: Diese Methode kann den entsprechenden Wert zurückgeben. –

+0

Danke! Ich hatte versucht, diesen Weg zu gehen und blieb stecken, wie ich die abstrakte Funktion erzwingen kann. Ich hatte einen Kopf frei und vergaß den No-Arg-Konstruktor und versuchte Dinge wie abstrakte Konstruktoren .... –

Antwort

27

@ PST Kommentar zu dieser Lösung führen.

Dies kann nicht mit einer Variablen durchgeführt werden. Aber eine abstrakte Klasse kann verlangen, dass ein bestimmtes Verfahren durchgeführt wird: diese Methode den geltenden Wert

Von Deklaration einer abstract Funktion zurückkehren könnte die Variable zu setzen oder zurückgeben, können Sie jede Unterklasse zwingen sie richtig zu implementieren.

Als nächstes muss die Funktion von jeder einzelnen Unterklasse der äußeren Klasse aufgerufen werden. Dies bedeutet, dass es irgendwo in der äußeren Klasse gemacht werden muss. Dies kann im Konstruktor ohne Argumente der äußeren Klasse durchgeführt werden, ohne sich um Subklassen kümmern Aufruf super:

Hinweis: Wenn ein Konstruktor nicht explizit einen Oberklassenkonstruktors aufrufen, der Java-Compiler fügt automatisch einen Anruf der Konstruktor ohne Argumente der Oberklasse. Wenn die Superklasse keinen Konstruktor ohne Argumente hat, erhalten Sie einen Kompilierungsfehler. Object hat einen solchen Konstruktor. Wenn Object also die einzige Superklasse ist, gibt es kein Problem. (Java docs: Super)

auf dieser Grundlage wird diese Lösung halten und richtig Kraft die Variable so lange eingestellt werden, wie entweder:

  1. Kein anderer Konstruktor wird in der übergeordneten Klasse erstellt (daher Super kann 't wird in einer Unterklasse verwendet, um stattdessen einen anderen Konstruktor aufzurufen)
  2. Alle anderen Konstruktoren in der Oberklasse rufen intern immer noch den Standardkonstruktor
auf

Der Code:

Superklasse:

public abstract class SuperClass { 
    // Variable all inner classes must set 
    static int myVar = 0; 

    public SuperClass() { 
     myVar = giveValue(); 
    } 

    public abstract int giveValue(); 
} 

Unterklasse:

public class SubClass extends SuperClass { 

    @Override 
    public int giveValue() { 
     return 5; // individual value for the subclass 
    } 

} 
+1

Danke! Habe meinen Tag gerettet !! – DevAndroid

8

Anstatt zu erzwingen, dass untergeordnete Klassen die Felder initialisieren, können Sie einer Kompositionsstrategie folgen, indem der Konstruktor Ihrer Klasse einen Parameter übernimmt, der eine Schnittstelle implementiert, die die Felder bereitstellt, die initialisiert werden sollen.

Verwandte Themen