2

Swing の私のアイコンには、次のようなさまざまな列挙型があります。

    public enum Icon32 {
    STOP("resources/icons/x32/stop.ico"),
    RUN("resources/icons/x32/run.ico");
    private File path;

    private Icon32(String path) {
        this.path = new File(path);
    }

    public File getFile() {
        return path;
    }

また

public enum Tab {
    XML("resources/icons/x32/tab/tab_1.ico"), QR("resources/icons/x32/tab/tab_2.ico"),ABOUT("resources/icons/x32/tab/tab_3.ico");
    private File path;

    private Tab(String path) {
        this.path = new File(path);
    }

    public File getFile() {
        return path;
    }

}

抽象的な実装を作成しました:

public abstract class AbstractImageType {

private File path;

private AbstractImageType(String path) {
    this.path = new File(path);
}

public File getFile() {
    return path;
}

@Override
public String toString() {
    return path.toString();
}

}

ただし、列挙型は拡張できません。

Syntax error on token "extends", implements expected

今私の質問は、メソッドとコンストラクターを実装する汎用クラス「AbstractImageType」を作成することは可能ですか? だから私は列挙値を挿入するだけですか?

このようなもの:

 public enum Icon32 extends AbstractImageType {
    STOP("resources/icons/x32/stop.ico"),
    RUN("resources/icons/x32/run.ico");
}
4

3 に答える 3

6

java の列挙型はクラスからの継承をサポートしていません。これは、それぞれenumが実際には拡張する単純なクラスであるためEnumです。多重継承はサポートされていないため、2 つの列挙型の基本クラスを作成することはできません。

この目的での列挙型の使用をやめることができます。つまり、通常のクラスに切り替えるか、委譲を使用してファイルを作成します。つまり、列挙型メンバーを受け入れてFileインスタンスを返すユーティリティです。

于 2013-05-22T08:52:04.113 に答える
5

AbstractImageTypeインターフェイスを作成し、列挙型にそれを実装させることができます。

public interface AbstractImageType {

    File getFile();
}

public enum Icon32 implements AbstractImageType  {
    STOP("resources/icons/x32/stop.ico"),
    RUN("resources/icons/x32/run.ico");
    private File path;

    private Icon32(String path) {
        this.path = new File(path);
    }

    public File getFile() {
        return path;
    }
}
于 2013-05-22T08:48:20.243 に答える
4

残念ながら、リスコフの置換原則を破る可能性があるため、列挙型に継承を使用することはできません。Java 8では、インターフェイスにメソッドのデフォルトの実装が含まれますが、コンストラクターには拡張されない可能性があります。

あなたができる最善の方法は、Eclipse のカスタム テンプレートなどを使用してコードを生成することです。

于 2013-05-22T08:53:15.173 に答える