2013-03-11 11 views
6

Mam wiele podklas klasy abstrakcyjnej, a każda z nich deklaruje publiczne, statyczne pole końcowe o tej samej nazwie. Myślałem o tym polu w abstrakcyjnej superklasie bez inicjowania go i mając nadzieję, że każda podklasa będzie zmuszona go zainicjować.Publiczne statyczne pole końcowe w klasie abstrakcyjnej lub interfejsie

Myślałem o tym, ponieważ wszystkie moje podklasy klasy abstrakcyjnej deklarują publiczne, statyczne, końcowe pole String o nazwie UNIQUE_ID, i dla każdej podklasy konieczne jest zadeklarowanie takiego pola z dokładnie taką nazwą.

Mam nadzieję, że moje pytanie jest wystarczająco jasne, jeśli nie, proszę, powiedz mi to.

Czy można zrobić coś mniej więcej równoważnego?

EDIT: Kod dodania:

Moja klasa abstrakcyjna wygląda następująco:

public abstract class ExperimentPanelModel extends Panelizable { 
protected String nextButtonText; 
protected String backButtonText; 
protected String skipButtonText; 
protected Properties currentFile; 
protected List<Properties> pastFiles = new ArrayList<Properties>(); 

public ExperimentPanelModel(Properties argcurrentfile, List<Properties> argpastfiles) { 
    currentFile = argcurrentfile; 
    pastFiles = argpastfiles; 
    nextButtonText = "Next"; 
    backButtonText = "Back"; 
    skipButtonText = "Skip"; 
} 
... 
} 

Niektóre non-abstrakcyjnych podklas tej klasy abstrakcyjnej wyglądać (zauważ, że wszystkie z nich deklaruje public static final String UNIQUE_ID) :

public class ConfigurationGUI extends ExperimentPanelModel { 

public static final String UNIQUE_ID = "ConfigurationGUI"; 
public static final String DATA_MODIFIED = "DataModified"; 

Date dateOfLastSession; 
int ExperimentalSession; 
int ExperimentOrder; 

boolean nextButtonEnabled = false; 

public ConfigurationGUI(Properties argcurrentfile, List<Properties> argpastfiles) { 
    super(argcurrentfile, argpastfiles); 
    nextButtonText = "Confirm"; 
    backButtonText = "Abort"; 
} 

... 
} 

przykładem więcej:

public class Introduction extends ExperimentPanelModel { 

public static final String UNIQUE_ID = "Introduction"; 
public static final String INSTRUCTIONS_XML_FILE = "instructions.xml"; 
public static final String THIS_INSTRUCTION_PROPERTY = UNIQUE_ID; 

private String thisInstructionText = UNIQUE_ID; 

Properties readInstructionsProperties = new Properties(); 

public Introduction(Properties argcurrentfile, List<Properties> argpastfiles) { 
... 

i ostatni:

public class Instruction1 extends ExperimentPanelModel { 

public static final String UNIQUE_ID = "Instruction1"; 
public static final String INSTRUCTIONS_XML_FILE = "instructions.xml"; 
public static final String THIS_INSTRUCTION_PROPERTY = UNIQUE_ID; 
... 
} 
+1

Proszę dodać fragmenty kodu, aby to pytanie było jaśniejsze! – ppeterka

+1

po napisaniu kodu pod numerem –

+1

mam nadzieję, że moja odpowiedź była pomocna. nie wiem, czy jest szybka naprawa, która jest lepsza niż obecna implementacja. na dłuższą metę odsunięcie od pól statycznych do osobnej struktury danych, która śledzi metadane, może być udoskonaleniem. –

Odpowiedz

8

Pomysł pola nie będzie działać, ponieważ pola statyczne nie mogą być zmienione w podklasach. Możesz zadeklarować metodę abstrakcyjną na klasie abstrakcyjnej, aby Twoje podklasy musiały ją zaimplementować.

Należy również pamiętać, że nie można uczynić go metodą statyczną, ponieważ te również nie są przesłonięte.

1

Umieść publiczne pole końcowe UNIQUE-ID w klasie abstrakcyjnej i zadeklaruj chroniony konstruktor, który pobiera wartość dla UNIQUE-ID. Nie będziesz w stanie zrobić tego statycznie, ponieważ wartości muszą być różne dla różnych instancji.

+0

Powyższa odpowiedź jest znacznie lepsza :-) – GHC

3

W twoim przypadku zdefiniowałbym zmienną w przodku. Nie ma sensu posiadanie zmiennej w każdej z rozszerzających się klas, chyba że masz szczególnie dobry powód, który nie brzmi jak posiadanie.

+1 za odpowiedź Nathana. W niektórych przypadkach lepiej to zrobić.

+0

dziękuję, przeczytałem pytanie, które oznacza, że ​​pole musiało przybrać inną wartość w każdej podklasie. pytanie nie jest jednak bardzo jasne. –

+0

Tak, problem polega na tym, że pytanie nie jest dobrze sformułowane. – carlspring

+0

Nathan Hughes przeczytał to dobrze. Właśnie dodałem jakiś kod, mam nadzieję, że teraz jest jaśniejszy. – deinocheirus

Powiązane problemy