У меня есть вспомогательный класс. Должен ли я рассмотреть возможность его удаления? - PullRequest
1 голос
/ 19 июля 2011

Я использую Telerik Rad Controls для AJAX.Я создал свой собственный контроль;их классы наследуются от классов RadControl.Ближайшим общим родительским классом для всех элементов управления Telerik, от которых я наследую, является «WebControl».Все элементы управления, которые я обсуждаю, реализуют ICormantControl, в котором нет ничего особенного:

public interface ICormantControl<T>
{
    T GetSettings();
}

Теперь в моем классе помощников у меня есть несколько методов.Я хотел бы начать с того, что, как мне кажется, у меня больше всего шансов сделать что-то.

    /// <summary>
    /// Saves a control -- writing it to Session and the DB. 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="control"></param>
    public static void Save<T>(ICormantControl<T> control)
    {
        T settings = control.GetSettings();
        string controlID = ((ISetting)settings).ID;

        SerializableDictionary<string, T> states = GetStates<SerializableDictionary<string, T>>();

        bool isKnown = states.ContainsKey(controlID);

        if (isKnown)
        {
            Logger.DebugFormat("{0} is known. Overwriting data.", controlID);
            states[controlID] = settings;
        }
        else
        {
            Logger.DebugFormat("{0} is unknown. Saving data.", controlID);
            states.Add(controlID, settings);
        }

        SetStates<SerializableDictionary<string, T>>(states);
    }

В настоящее время, чтобы сохранить состояние элемента управления, я, например, вызываю StateManager.Save<RadDockSetting>(dock).

Я полагаю, что лучшая реализация позволила бы мне сказать: dock.Save().

Насколько я понимаю, я застрял между камнем и наковальней.У меня сложилось впечатление, что если я перенесу объявление Save в мой интерфейс ICormantControl, то мне придется перенести реализацию Save в каждый из элементов управления, которые реализуют ICormantControl.Это привело бы к большому количеству дублированного кода.

Должен ли я оставить свою реализацию в своем вспомогательном классе, переместить объявление в ICormantControl, а затем в каждом классе, который реализует ICormantControl, я перенаправить реализацию на свойвспомогательный метод?

Насколько я могу судить, я не могу наследовать все свои элементы управления от промежуточного класса.Общий родительский элемент находится слишком далеко в иерархии унаследованных родительских элементов управления.Может быть возможно расширить WebControl и реализовать в нем функцию Save, но это кажется на несколько порядков хуже, чем мое предложение выше.

У меня есть другие варианты?

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

То, что вы хотите, это метод расширения .Измените ваше объявление следующим образом:

public static void Save<T>(this ICormantControl<T> control)

Тогда вы сможете выполнить dock.Save() без необходимости изменять интерфейс ICormantControl или любой другой класс.

1 голос
/ 19 июля 2011

Методы расширения решат вашу проблему.Пример написания метода расширения.

Передача экземпляра HtmlHelper другому методу MVC3 с помощью Razor

 public static void Save<T>(this  ICormantControl<T> control)
 { 
 }

Магия в этом ключевом слове, поэтому теперь вы можете использоватьdoc.Save () где это указывает на doc.

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