Java抽象变量(超类使用子类的字符串)
我有一个Java抽象变量(超类使用子类的字符串),java,string,abstract,superclass,Java,String,Abstract,Superclass,我有一个抽象类加载器: 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 di
抽象类
加载器:
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;
}
}
公共抽象类加载器
{
私有字符串扩展=“.xxx”;
私有字符串目录;
公共抽象对象加载(字符串文件);
公共摘要列表加载列表(字符串文件,整数);
公共加载程序(字符串目录)
{
this.dir=dir.replace(“\\”,“/”+“/”;;
}
公共字符串formatName(字符串名称)
{
返回目录+名称+扩展名;
}
}
它的子类应该能够更改扩展
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
}
}
公共类midloader扩展了midloader
{
私有字符串扩展=“.mid”;
公共MIDI加载程序(字符串目录)
{
高级(署长);;
}
公共MIDI加载程序()
{
super(Constants.SOUNDDIR);
}
@凌驾
公共序列加载(字符串文件)
{
废话
}
公共列表加载列表(字符串文件,整数)
{
废话
}
}
扩展名“.mid”应该由Loader
的formatName
函数使用。我如何让它做到这一点(不重复代码)
谢谢。有一个构造函数
protected Loader(String dir, String ext)
这样,扩展由子类决定
顺便说一句,将抽象类的构造函数设置为公共的可能会让人困惑,因为它不能被公开使用。拥有一个构造函数
protected Loader(String dir, String ext)
这样,扩展由子类决定
顺便说一句,为抽象类
公共创建构造函数可能会令人困惑,因为它不能公开使用。问题是您不能重写仅属性的方法。为了遵循更好的OOP模型,您应该使用封装并为扩展提供getter和setter。在装入器类中放入类似的内容:
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构造函数中,您可以调用callsuper(dir,extension)
或者,您可以忽略构造函数和setter,只在每个子类中定义getExtension()。如果您采用这种方式,最好将getExtension抽象化
因此,Loader将定义以下内容:
公共抽象字符串getExtension()代码>
抽象方法必须由子类实现,并且不能实例化抽象类本身。这意味着MidLoader将被迫提供一个名为getExtension()的方法,该方法返回字符串,formatName将始终有效(使用我的扩展formatName方法)。问题是您无法重写仅属性的方法。为了遵循更好的OOP模型,您应该使用封装并为扩展提供getter和setter。在装入器类中放入类似的内容:
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构造函数中,您可以调用callsuper(dir,extension)
或者,您可以忽略构造函数和setter,只在每个子类中定义getExtension()。如果您采用这种方式,最好将getExtension抽象化
因此,Loader将定义以下内容:
公共抽象字符串getExtension()代码>
抽象方法必须由子类实现,并且不能实例化抽象类本身。这意味着MidLoader将被迫提供一个名为getExtension()的方法,该方法返回字符串,formatName将始终有效(使用我的扩展formatName方法)。我不太喜欢这个方法,但我想它已经足够了。我不太喜欢这个方法,但我想这就足够了。大写名称是常量时留下的。我试着改变修饰符,看看是否能让它工作,但忘了改变大小写。大写名称是常量时的遗留名称。我试图改变周围的修改器,看看是否可以让它工作,但忘了改变情况。