1

私はabstract classローダーを持っています:

public abstract class Loader
{
    private String EXTENSION = ".xxx";
    private String dir;

    public abstract Object load(String file);
    public abstract List<?> loadList(String file, int number);

    public Loader(String dir)
    {
        this.dir = dir.replace("\\", "/") + "/";;
    }

    public String formatName(String name) 
    {
        return dir + name + EXTENSION;
    }
}

そのサブクラスは EXTENSION を変更できる必要があります

public class MidiLoader extends Loader
{
    private String EXTENSION = ".mid";

    public MidiLoader(String dir)
    {
        super(dir);
    }

    public MidiLoader()
    {
        super(Constants.SOUNDDIR);
    }

    @Override
    public Sequence load(String file)
    {
        blah
    }

    public List<Sequence> loadList(String file, int number)
    {
        blah
    }

}

拡張子 ".mid" はLoaderformatName関数で使用する必要があります。(コードを複製せずに)これを行うにはどうすればよいですか?

ありがとう。

4

2 に答える 2

4

コンストラクタを持つ

protected Loader(String dir, String ext)

このように、拡張子はサブクラスによって決定されます。

ところで、抽象クラスのコンストラクターを作成すると、publicパブリックに使用できないため、混乱する可能性があります。

于 2013-05-12T21:18:05.603 に答える
0

問題は、プロパティのみのメソッドをオーバーライドできないことです。より良い OOP モデルに従うには、カプセル化を使用し、EXTENSION に getter と setter を提供する必要があります。Loader クラスに次のようなものを入れます。

 private String extension = ".xxx"

 public void setExtension(String extension) {
     this.extension = extension;
 }

 public String getExtension() {
     return this.extension;
 }


public String formatName(String name) {
    return dir + name + getExtension();
}

プロパティが実際に定数でない限り、拡張子には小文字の名前を使用することをお勧めします。次に、いくつかのコンストラクターをローダーに追加することもできます。

// Previous without using an explict extension
public Loader(String dir) {
  ...
}

public Loader(String dir, String extension)
{
   this(dir); // call the default constructor
   this.extension = extension;
}

次に、MidiLoader コンストラクター内で call を呼び出すことができますsuper(dir,extension)

または、コンストラクターとセッターを無視して、すべてのサブクラスで getExtension() を定義することもできます。その方法をとった場合は、getExtension を抽象化するのが最善です。

そのため、Loader は次のように定義されます。

public abstract String getExtension();

抽象メソッドはサブクラスで実装する必要があり、抽象クラス自体をインスタンス化することはできません。つまり、MidiLoader は String を返す getExtension() というメソッドを提供する必要があり、formatName は常に機能します (拡張された formatName メソッドを使用)。

于 2013-05-12T21:28:29.313 に答える