1

我想实现静态调用File.XLS.Export(columnNames, dbNames);File.CSV.Export(delimiter, columnNames, dbNames);

到目前为止,我设计了一个抽象类并让 CSV 和 XLS 继承自它。如您所见,使用 CSV 导出时我可能需要不同的签名。我可以重载,但我不想在 XLS 导出中看到重载,因为它在那里完全没用。

那么如何在我的 XLS 导出中隐藏这个特定的实现呢?有没有我可以使用的模式?

4

3 回答 3

2

我想说看看Liskov Substitution Principle。归结为同一抽象的两个具体实现应该是可互换的。如果在示例中将 XLS 替换为 CSV 实现,则必须更改源代码。

 // Some client code
 // it has to be aware of differing implementations, so if this changes to CSV
 // this code changes
 File exported = XLS.export(columnNames, dbNames);

与其使用静态方法,我更喜欢 XLSExporter 和 CSVExporter 都派生自同一个基类并具有完全相同的接口的方法。我是一个 Java 人,但你应该能够明白:

 public interface Exporter {
    public File export();
 }

 public class XLSExporter implements Exporter {
    public XLSExporter(String[] columns, String[] databases) // specifics go in constructor

    public File export() // ...
 }

 public class CSVExporter implements Exporter {
    public CSVExporter(String delim, String[] columns, String[] databases) // specifics go in constructor

    public File export() // ...
 }

现在,Exporter 的客户不需要了解不同的参数。他们只是用他们得到的任何东西出口。这将使您的代码灵活且可维护。

 // new client code
 // doesn't care about what kind of exporter it is, it just executes what it's given
 File exported = exporter.export();
于 2012-08-27T13:25:39.320 回答
0

经过一些方法后,我将使用 ExtensionMethods 来实现。它似乎最适合我们的环境。

于 2012-08-28T06:33:52.567 回答
0

如果您需要这两个函数是静态的,那么您不需要继承。只需创建一个类并在其中添加两个不同的静态函数,它们具有不同的签名和不同的实现。我认为您对其进行了过度设计,特别是在考虑现有代码库对您施加的唯一约束以使功能静态时。

于 2012-08-28T06:41:17.510 回答