Java抽象变量(超类使用子类的String)

时间:2013-05-12 21:15:49

标签: java string abstract superclass

我有一个abstract class Loader:

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
    }

}

EXTENSION“.mid”应由Loader的{​​{1}}函数使用。我如何做到这一点(没有重复代码)?

感谢。

2 个答案:

答案 0 :(得分:4)

有一个构造函数

protected Loader(String dir, String ext)

这种扩展方式是由子类决定的。

BTW为抽象类public制作构造函数可能会令人困惑,因为它无法公开使用。

答案 1 :(得分: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();
}

除非属性实际上是常量,否则最好使用小写名称作为扩展名。然后,您还可以向Loader添加一些构造函数。

// 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)

或者,您可以忽略构造函数和setter,只需在每个子类中定义getExtension()。如果你走那条路线,最好把getExtension抽象化。

So Loader会定义以下内容:

public abstract String getExtension();

抽象方法必须由子类实现,并且您无法实例化抽象类本身。这意味着MidiLoader将被强制提供一个名为getExtension()的方法,该方法返回一个String,并且formatName始终有效(使用我的扩充formatName方法)。