6

抽象クラスのサブクラスがたくさんあり、それぞれが同じ名前の public static final フィールドを宣言しています。このフィールドを初期化せずに抽象スーパークラスに配置し、各サブクラスが強制的に初期化されることを期待していました。

抽象クラスのすべてのサブクラスが UNIQUE_ID と呼ばれる public static final String フィールドを宣言し、すべてのサブクラスがそのようなフィールドを正確にその名前で宣言する必要があるため、これを考えていました。

私の質問が十分に明確であることを願っています。そうでない場合は、教えてください。

これと多かれ少なかれ同等のことを行うことはできますか?

編集:コードが追加されました:

私の抽象クラスは次のようになります。

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";
}
...
}

その抽象クラスの非抽象サブクラスのいくつかは次のようになります (それらすべてが を宣言していることに注意してください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";
}

...
}

もう1つの例:

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

そして最後のもの:

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;
...
}
4

3 に答える 3

8

静的フィールドはサブクラスでオーバーライドできないため、フィールドのアイデアは機能しません。できることは、サブクラスがそれを実装する必要があるように、抽象クラスで抽象メソッドを宣言できることです。

また、オーバーライドされないため、静的メソッドにすることはできないことに注意してください。

于 2013-03-11T16:55:41.010 に答える
3

あなたの場合、祖先で変数を定義します。特に正当な理由がない限り、拡張クラスのそれぞれに変数を使用しても意味がありません。

ただし、ネイサンの返信には+1。かなりの数のケースで、それはより良いことです。

于 2013-03-11T17:09:42.653 に答える
2

public final フィールド UNIQUE-ID を抽象クラスに入れ、UNIQUE-ID の値を取る保護されたコンストラクターを宣言します。ただし、値はインスタンスごとに異なる必要があるため、静的にすることはできません。

于 2013-03-11T16:56:43.593 に答える