我要实现静态调用像File.XLS.Export(columnNames, dbNames);
或File.CSV.Export(delimiter, columnNames, dbNames);
设计具有相同名称的不同签名的派生类中
现在我设计了一个抽象类,让CSV和XLS继承它。 正如你所看到的,我使用CSV导出时可能需要一个不同的签名。我可以做一个重载,但是我不想在XLS导出中看到那个过载,因为它在那里完全没用。
那么如何在我的XLS导出中隐藏这个特定的实现?有没有可以使用的图案?
我要实现静态调用像File.XLS.Export(columnNames, dbNames);
或File.CSV.Export(delimiter, columnNames, dbNames);
设计具有相同名称的不同签名的派生类中
现在我设计了一个抽象类,让CSV和XLS继承它。 正如你所看到的,我使用CSV导出时可能需要一个不同的签名。我可以做一个重载,但是我不想在XLS导出中看到那个过载,因为它在那里完全没用。
那么如何在我的XLS导出中隐藏这个特定的实现?有没有可以使用的图案?
经过一些方法后,我打算用ExtensionMethods来做。它似乎最适合我们的环境。
我会说检查出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() // ...
}
现在的出口商的客户并不需要了解的不同参数。他们只是出口他们交给的任何东西。这将使你的代码变得灵活和可维护。
// new client code
// doesn't care about what kind of exporter it is, it just executes what it's given
File exported = exporter.export();
如果你需要这两个函数是静态的,那么你不需要继承。只需制作一个类,并在其中粘贴两个不同的静态函数,并使用不同的签名和不同的实现。我认为你是在过度设计它,特别是在考虑现有代码库对你施加的唯一约束以使函数保持静态时。
你说得对。这就是为什么我得出结论使用扩展方法。我只想要两个类中的相同方法名称。 但现在我要(重载).ToXLS和.ToCSV – UNeverNo
感谢您的建议,但我需要将其设为静态,因为我们现有的所有基本功能都是静态的。 – UNeverNo