2013-05-12 40 views
1

我有一个abstract class装载机:Java抽象变量(超使用子类的字符串)

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

它的子类应该可以改扩建

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

有一个构造

protected Loader(String dir, String ext) 

这样的扩展是由子类确定。

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

+0

我不是这种方法的巨大粉丝,但我认为它就足够了。 – 2013-05-12 21:19:13

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构造函数里面,你可以打电话叫super(dir,extension)

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

所以装载机将具有以下定义:

public abstract String getExtension();

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

+0

大写字母的名字是一个常数后的剩余字符。我试着改变一下修饰符,看看能不能改变它,但忘记改变大小写。 – 2013-05-12 21:34:31