继承的组合 - 如何使组件可扩展?

时间:2018-05-05 17:58:46

标签: c# inheritance components

由于我的代码被多重/钻石继承问题所困扰,我一直在尝试学习并切换到更多的合成模式。

尽管我付出了最大的努力,但我并没有真正做到这一点'因为它与我的代码有关。我没有把所有东西放在基类中,而是试图想到可以分解成其他组件的行为。

问题是我不知道如何使类或组件可扩展。

这是我的代码的一个例子......

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中公开它。 1}}。然后SelectList的每个实例都会公开我可能不一定想要的方法。

我在想这个错吗?

1 个答案:

答案 0 :(得分:0)

我想你想做这样的事情,但不确定这会有所帮助

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