我有一个基类ExportType
和几个实现特定数据导出的继承类。
继承的类需要几个参数来定义从数据库导出数据的方式。这些参数可以从一个类到另一个不同。
所以我想用Dictionary<string, string>
来处理导出参数,在我的基类中我放了这样的方法:
public abstract void Export (Dictionary<string, string> exportParams);
这是最好的方法,还是有更好的方法来处理不同的参数?
答案 0 :(得分:4)
由于您无法确定特定导出类型需要哪些参数,因此您有以下几种选择:
如果您将导出的具体实现隐藏到被调用的多态,那么您不应指望他们知道您的内部参数。
我会将您的导出界面简化为:
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
}
}
答案 1 :(得分:2)
根据它的调用方式,您可以使基类具有通用性,并采用您创建的参数类的类型。
public abstract class BaseClass<TExportParams>
{
public abstract void Export(TExportParams exportParams);
}
public class Derived : BaseClass<DerivedExportParamsClass>
{
public void Export(DerivedExportParamsClass exportParams)
{
}
}
如果您想要调用它时不知道传递给Export
的参数类型,那么请使用@ Groo的答案。