static individuell "vererben"?

Bamboo

Mitglied
Ich habe schon auf Google und hier speziell im Forum gesucht, habe aber keine (gute) Lösung gefunden.

Und zwar: ich möchte eine Klassenhierarchie mit der Superklasse 'Item' erstellen, etwa so:

Java:
class Item {
     private static final String NAME;

     public String getName {
          return NAME;
     }

     ...

}

Eine Klasse, die 'Item' erweitert, wäre dann z.B. 'Torch':


Java:
class Torch extends Item {
     private static final String NAME = "Fackel";

     oder idealerweise (bzw. im Konstruktor):

     static {
          NAME = "Fackel";
     }


}

Eine Liste, die 'Item' enthält, soll dann idealerweise in etwa so durchlaufen werden:

Java:
items[i].getName();

Eventuell kann ja getName() auch irgendwie statsich gehalten werden.

Ich weiß, dass die Syntax so natürlich nicht funktioniert; eine statische Variable in der Superklasse gilt ja für alle beerbten Klasse und kann nicht "überschrieben" werden.

Aber ich würde gerne wie oben beschrieben so auf 'NAME' zugreifen können, und da dass so nicht klappt, fallen mir nur zwei Wege ein:

1. Statt einer statischen Variable NAME eine Membervariable einführen, die vererbt oder über eine Schnittstelle implementiert wird (was für mich aber nach Speicherverschwendung klingt, denn dann würde ja jede Instanz einer 'Item'-Unterklasse eine eigene Membervariable jedoch mit identischem Inhalt haben; aber vielleicht fällt das ja kaum ins Gewicht, ich weiß nicht so genau); oder die Variable 'NAME' bleibt statisch, aber der Getter wird als Methode über eine Schnittstelle implementiert und immer gleichlautend überschrieben (return NAME), aber auch das klingt nicht wirklich elegant.

oder

2. Die 'NAME'-Werte der Unterklasse als Liste in der Superklasse 'Item' speichern, worauf die Unterklassen dann zugreifen können.

Ich bin mit beiden Lösungen ziemlich unzufrieden. Kennt denn jemand einen Weg, das gewünschte Verhalten zu bewerkstelligen?


Also nochmal kurz: jede Unterklasse von 'Item' soll quasi eine eigene Klassenvariable 'vererbt' bekommen, auf die dann von jeder 'Item'-(Unterklassen-)Instanz aus zugegriffen werden kann (am besten so: String itemName = new Torch().getName() --> "Fackel").


Vielleicht ist es mit einer Membervariablen wirklich am besten und ich bilde mir Unsinn ein...
 
Man könnte pro Unterklasse eine neue statische Variable hinzufügen, und/oder dann eine getName() methode passend überschreiben.
du könntest auch versuchen über .getClass().getName() an den namen der klasse zu kommen
 
Die einfachste Lösung:
Java:
abstract class Item {
    public abstract String getName();
}
Java:
class Torch extends Item {
    @Override
    public String getName() {
        return "Fackel";
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Man könnte pro Unterklasse eine neue statische Variable hinzufügen, und/oder dann eine getName() methode passend überschreiben.
du könntest auch versuchen über .getClass().getName() an den namen der klasse zu kommen

Die Ideen hatte ich mir auch schon überlegt, aber ich hatte gehofft ich könnte mir das copy&paste-Überschreiben irgendwie ersparen, denn die Methode hat ja eigentlich immer den gleichen Inhalt. Das mit .getClass().getName() mit getName() als statischer Methode habe ich versucht, aber es ging nicht so recht:


Java:
public class ClassA {
    public static void main (String[] args) {
         ClassB b = new ClassB();

         b.getClass().dance();
    }
}
Java:
public class ClassB {
    public static void dance() {};
}

So funktioniert das nicht, oder?


Danke für die schnelle Antwort! 🙂


EDIT:
@Tummo:

Ok, aber den Namen bräuchte ich wenn möglich als Variable, da auch andere Methoden auf sie zugreifen würden.


Also scheint das mit einer überschriebenen Methode der einzige Weg zu sein... dann werde ich das mal so machen, vielen Dank!
 
Zuletzt bearbeitet:
Ahh, ich hatte dich missverstanden. Ich möchte aber später den Namen wenn möglich aus einer Textdatei auslesen, also zur Laufzeit initialisieren, um so etwas wie eine Sprachauswahl zu realisieren (vielleicht geht das auch viel einfacher, aber das ist ja jetzt nicht Thema); und daher dachte ich, man bräuchte eine Klassenvariable.

Aber deine Lösung ist wirklich die einfachste, vielen Dank.
 
Wenn du das vorhast, reicht sogar eine einzige Methode in der Basisklasse, welche den lokalisierten Namen für die Klasse aus dem ResourceBundle holt.
 

Neue Themen


Zurück
Oben