Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Design patterns 在派生类中设计具有相同名称的不同签名_Design Patterns_Inheritance_.net 3.5 - Fatal编程技术网

Design patterns 在派生类中设计具有相同名称的不同签名

Design patterns 在派生类中设计具有相同名称的不同签名,design-patterns,inheritance,.net-3.5,Design Patterns,Inheritance,.net 3.5,我想实现静态调用,比如File.XLS.Export(columnNames,dbNames)或File.CSV.Export(分隔符、列名、数据库名) 现在我设计了一个抽象类,并让CSV和XLS从中继承。 如您所见,使用CSV导出时,我可能需要不同的签名。我可以做一个重载,但我不想在XLS导出中看到这个重载,因为它在那里完全没有用 那么,如何在XLS导出中隐藏此特定实现?有没有我可以使用的模式?我想说的是,看看这个。它归结为同一抽象的两个具体实现应该是可互换的。在示例中,如果将XLS替换为CS

我想实现静态调用,比如
File.XLS.Export(columnNames,dbNames)
File.CSV.Export(分隔符、列名、数据库名)

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

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

我想说的是,看看这个。它归结为同一抽象的两个具体实现应该是可互换的。在示例中,如果将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();

在一些方法之后,我将使用ExtensionMethods来完成它。它似乎最适合我们的环境。

如果需要这两个函数是静态的,那么就不需要继承。只需创建一个类,并在其中粘贴两个不同的静态函数,使用不同的签名和不同的实现。我认为你设计得太过火了,尤其是考虑到你现有的代码库对你施加的唯一约束,使函数保持静态。

谢谢你的建议,但我需要静态地进行,因为我们现有的所有基本函数都是静态的。你是对的。这就是为什么我得出使用扩展方法的结论。我想要的只是两个类中的相同方法名。但现在我选择(过载).ToXLS和.ToCSV