处理继承类中的参数的最佳方法

时间:2012-01-11 10:35:58

标签: c# .net inheritance parameters

我有一个基类ExportType和几个实现特定数据导出的继承类。

继承的类需要几个参数来定义从数据库导出数据的方式。这些参数可以从一个类到另一个不同。

所以我想用Dictionary<string, string>来处理导出参数,在我的基类中我放了这样的方法:

public abstract void Export (Dictionary<string, string> exportParams);

这是最好的方法,还是有更好的方法来处理不同的参数?

2 个答案:

答案 0 :(得分:4)

由于您无法确定特定导出类型需要哪些参数,因此您有以下几种选择:

  1. 使用字典(与您提议的那样):可扩展,但没有类型安全
  2. 使用接口的基类:仍然没有类型安全性,因为您需要在每个特定的导出方法中进行转换。
  3. 使参与实现特定且隐藏于调用者:首选恕我直言。
  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的答案。