Лучший способ обработки параметров в унаследованных классах - PullRequest
3 голосов
/ 11 января 2012

У меня есть базовый класс ExportType и несколько унаследованных классов, которые реализуют определенный экспорт данных.

Унаследованные классы нуждаются в нескольких параметрах, чтобы определить способ экспорта данных из базы данных.Эти параметры могут отличаться от класса к другому.

Поэтому я решил использовать Dictionary<string, string> для обработки параметров экспорта, и в своем базовом классе я поместил метод, подобный этому:

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

Это лучший способ сделать это, или есть лучшие способы обработки различных параметров?

Ответы [ 2 ]

4 голосов
/ 11 января 2012

Поскольку вы не можете точно знать, какие параметры понадобятся конкретному типу экспорта, у вас есть несколько вариантов:

  1. Используйте словарь (как вы предложили): расширяемый, но без безопасности типов
  2. Использовать базовый класс для интерфейса : безопасность типов по-прежнему отсутствует, поскольку вам необходимо приводить внутри каждого конкретного метода экспорта.
  3. Сделать параметры специфичными для реализации и скрытыми от вызывающей стороны : предпочтительнее IMHO.

Если вы скрываете конкретную реализацию вашего экспорта в вызываемую полиморфизм, то не следует ожидать, что они узнают о ваших внутренних параметрах.

Я бы упростил ваш интерфейс экспорта до:

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
    }
}
2 голосов
/ 11 января 2012

В зависимости от того, как он вызывается, вы можете сделать базовый класс универсальным, принимая тип создаваемого вами класса параметров.

public abstract class BaseClass<TExportParams>
{
    public abstract void Export(TExportParams exportParams);
}

public class Derived : BaseClass<DerivedExportParamsClass>
{
    public void Export(DerivedExportParamsClass exportParams)
    {

    }
}

Если вы не знаетевведите параметры для Export, когда вы хотите вызвать его, а затем ответьте @ Groo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...