Композиция над наследованием - Как сделать компоненты расширяемыми? - PullRequest
0 голосов
/ 05 мая 2018

Из-за того, что мой код застрял в проблеме множественного / алмазного наследования, я пытался изучить и переключиться на более сложный шаблон.

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

Проблема в том, что я не знаю, чтобы сделать класс или компоненты расширяемыми.

Это пример моего кода ...

public class SelectList : BaseControl
{
    private ISelectListActions SelectActions { get; }

    public string Text {
        get { return SelectActions.Text; }
    }

    public SelectList(IWebDriver driver, By locator, ISelectListActions selectActions) : base(driver, locator)
    {
        SelectActions = selectActions;
    }

    public void SelectByText(string text)
    {
        SelectActions.SelectByText(text);
    }
}

SelectActions разработан, чтобы быть моим компонентом, представляющим все виды поведения (все сгруппированы для этого примера).

Допустим, я хочу расширить функциональность класса SelectList, добавив новый метод с именем CheckText.

Традиционное решение наследования будет выглядеть примерно так ...

public class BetterSelectList : SelectList
{
    public BetterSelectList(IWebDriver driver, By locator, ISelectListActions selectActions) : base(driver, locator, selectActions) { }

    public void CheckText()
    {
        Console.WriteLine("CheckText");
    }
}

Но что, если мне понадобится сделать это еще 5 раз - я снова окажусь в кроличьей норе по наследству.

Я не могу понять состав раствора:

Если я добавлю новый CheckText метод к ISelectListActions и предоставлю конкретную реализацию, мне нужно будет выставить его в SelectList, если я хочу использовать его из экземпляра SelectList. Тогда каждый экземпляр SelectList будет раскрывать тот метод, который мне не обязательно нужен.

Я думаю об этом неправильно?

1 Ответ

0 голосов
/ 05 мая 2018

Я думаю, вы хотите сделать что-то подобное, но не уверены, что это поможет или нет

abstract class Action
    {
        public void Perform(SelectList list)
        {
          Console.WriteLine("CheckText");
        }
    }

class CheckBoxAction1:Action
{
    public void Perform(SelectList list)
    {
      Console.WriteLine("CheckText1");
    }
}

class CheckBoxAction2:Action
{
    public void Perform(SelectList list)
    {
      Console.WriteLine("CheckText2");
    }
}
class ComposedActions{
    private Action _action;
    public ComposedActions(Action action)
    { 
      _action=action;
    }
    public void Perform(SelectList list)
    {
      _action.Perform(list);
    }
 }
ComposedActions action1= new ComposedActions(new CheckBoxAction1());
ComposedActions action2= new ComposedActions(new CheckBoxAction2());
SelectList list = new SelectList();
action1.Perform(list);
//CheckText1
action2.Perform(list);
//CheckText2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...