我有一个基类 ExportType
以及几个实现特定数据导出的继承类。
继承的类需要几个参数来定义数据从数据库导出的方式。这些参数可以因类而异。
所以我想使用 Dictionary<string, string>
为了处理导出参数,在我的基类中我放置了一个这样的方法:
public abstract void Export (Dictionary<string, string> exportParams);
这是最好的方法吗,还是有更好的方法来处理不同的参数?
最佳答案
由于您无法确定特定导出类型需要哪些参数,因此您有多种选择:
- 使用字典(如您建议的那样):可扩展,但没有类型安全
- 为接口(interface)使用基类:仍然没有类型安全,因为您需要在每个特定的导出方法中进行强制转换。
- 使参数特定于实现并向调用者隐藏:首选恕我直言。
如果您通过多态性隐藏了导出到调用的具体实现,那么您不应该期望它们知道您的内部参数。
我会将您的导出界面简化为:
interface IExport
{
void Export(); // or Export(string filename), alternatively
}
然后按照您需要的方式实例化每个具体类:
// no params
IExport txt = new TextExport();
// single string (delimiter)
IExport csv = new DelimitedExport(",");
// lots of params
IExport excel = new ExcelExport(someStronglyTypedOptions);
这样您的调用代码就不需要为传递这些参数而烦恼了。
[编辑]
总结:没有其他明显的好处,您可以通过重写以下内容轻松解决参数类型的问题:
var csv = new ExcelExport();
csv.Export(parameters);
为此:
var csv = new ExcelExport(parameters);
csv.Export();
有一次,某人 需要知道要实例化哪些参数以及如何实例化。这意味着从那时起,其他人 都可以接受 IExport
实例,并且只能调用普通的无参数方法。
您的具体实现将具有不同的构造函数,并且通常会遵循以下模式:
class ExcelExport : IExport
{
private readonly ExcelParams _params;
public ExcelExport(ExcelParams parameters)
{
_params = parameters;
}
public void Export()
{
// do stuff
}
}
关于c# - 处理继承类中参数的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8817831/