Lassen Sie uns sagen, dass wir eine abstrakte Klasse, die einen Konstruktor definiert eine ganze Zahl nehmen, wo eine Voraussetzung überprüft, ob die ganze Zahl innerhalb einer Liste der möglichen Werte ist:Wie statische Element in der untergeordneten Klasse zu initialisieren?
public abstract class Value {
protected int value;
protected static List<Integer> possibleValues;
public Value(int val) {
if (!possibleValues.contains(val))
throw new IllegalArgumentException("Illegal value");
value = val;
}
}
Aber wir diese Liste in Value
‚s Kind initialisieren Klassen, weil jeder eine eigene Liste möglicher Werte definiert.
Ich denke, ich könnte einen static
Block hinzufügen Mitglieder possibleValues
, obwohl ich nicht static
Blöcke. Das bedeutet jedoch nicht, dass alle untergeordneten Klassen nicht mehr auf die gleiche Liste möglicher Werte zeigen würden.
Wie kann ich erzwingen, dass die untergeordneten Klassen eine Liste möglicher Werte definieren und die Vorbedingungsprüfung durchführen, ohne die beschriebenen Probleme zu behandeln?
Edit: also könnten wir sagen, ich möchte das Verhalten erben, aber nicht die Variable selbst.
Warum nicht eine abstrakte 'isValid' Methode definieren, die Kind-Klassen ausfüllen? Oder lassen Sie Value mit einer ValueChecker-Klasse templatisieren, die von abgeleiteten Klassen bereitgestellt wird? – Robert
Ich würde vorschlagen, ein Set anstelle einer Liste zu verwenden. Außerdem wäre die Verwendung eines Fabrikmusters brauchbarer und sauberer. –