接口或抽象类

接口或抽象类

问题描述:

我的Java是有些生疏,我相信我这样做不对接口或抽象类

我有一大堆,我需要导出不同fileformats的。所以我虽然我会为每种格式创建一个类,并让它们都实现一个标准接口。

每个文档都有一个名称和默认文件名,但我不知道该如何正确存储该数据。最初,我认为它应该是具体类中的静态最终字符串,但是如何通过接口强制执行它,以便所有具体类都必须提供该信息。

希望这是有道理的,这是我迄今为止

public interface IExporter { 

    public void exportToFile(String filename) throws SQLException, IOException; 

    public String getDocumentName(); 

    public String getDefaultFilename(); 

} 

-

public class LaneDrawCsvExporter implements IExporter { 

    public void exportToFile(String filename) throws SQLException, IOException { 
     // code to export document here 
    } 

    public String getDocumentName() { 
     return "Lane Draw"; 
    } 

    public String getDefaultFilename() { 
     return "Lane Draw.CSV"; 
    } 
} 
+1

我不明白为什么你的代码缺乏在子类中强制执行文件名存在。你能多解释一下吗? –

+0

这里有一个不同的网站:http://codereview.stackexchange.com/ –

+0

@VictorSorokin这个例子并不缺乏它,它只是有一种感觉,我错了,把一个字符串硬编码到getters – bumperbox

你的方法看起来是合理的。至于如何强制提供文档名称和默认文件名,我认为你所做的工作 - 在界面中有返回文档名称和默认文件名的方法。所有实现接口的具体类都必须实现这些方法才能编译。因此你已经强制要求具体类必须提供这些名称。我认为试图强制具体的类有一个特别命名的静态最终字符串是一个红鲱鱼,因为你有这些方法可用。

从出口商分离文件信息。所以你有一大堆出口商,其唯一的任务是导出文件,以及一些链接到文件和右侧导出器的对象(也可能是一些附加结构来决定使用哪个导出器)。

我会创建一个名为BaseIEExporter的类abstract,然后在(如名称/文件名)内提供一对(或多个)实例变量及其getter和setter方法。或者所有实施类之间的共同特征。

当您创建一个扩展抽象类的新类时,只需重载构造函数即可提供您需要的任何参数。

这种创建某个类的过程需要您提供所需的信息,即构造函数需要它。

如果您需要强制设置类的初始状态(文件名等),最好使用Abstract类。 下面只是给你一个想法(你需要重构它)

注意:由于在父抽象类中没有默认(或无参数)构造函数必须指定在子类中使用的构造函数。

public abstract class Exporter { 

    string FileName 
    public Exporter (string fileName) { 
     FileName= fileName 
    } 

    public void exportToFile() .... 

    public String getDocumentName().... 

    public String getDefaultFilename().... 

} 
- 

public class LaneDrawCsvExporter extends Exporter { 

public LaneDrawCsvExporter (string fileName) { 
     super(fileName) 
    } 

public void exportToFile() throws SQLException, IOException { 
// code to export document here 
} 

public String getDocumentName() { 
    return "Lane Draw"; 
} 

public String getDefaultFilename() { 
    return "Lane Draw.CSV"; 
} 
}