Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java抽象变量(超类使用子类的字符串)_Java_String_Abstract_Superclass - Fatal编程技术网

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构造函数中,您可以调用call
super(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构造函数中,您可以调用call
super(dir,extension)

或者,您可以忽略构造函数和setter,只在每个子类中定义getExtension()。如果您采用这种方式,最好将getExtension抽象化

因此,Loader将定义以下内容:

公共抽象字符串getExtension()


抽象方法必须由子类实现,并且不能实例化抽象类本身。这意味着MidLoader将被迫提供一个名为getExtension()的方法,该方法返回字符串,formatName将始终有效(使用我的扩展formatName方法)。

我不太喜欢这个方法,但我想它已经足够了。我不太喜欢这个方法,但我想这就足够了。大写名称是常量时留下的。我试着改变修饰符,看看是否能让它工作,但忘了改变大小写。大写名称是常量时的遗留名称。我试图改变周围的修改器,看看是否可以让它工作,但忘了改变情况。