【问题标题】:Composition over inheritance - How to make components extensible?组合优于继承 - 如何使组件可扩展?
【发布时间】:2018-10-15 23:28:22
【问题描述】:

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

尽管我尽了最大努力,但我并没有真正“明白”,因为它与我的代码有关。我没有将所有东西都放在基类中,而是一直在尝试考虑可以拆分为其他组件的行为。

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

这是我的代码示例...

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 被设计为代表所有行为的组件(在本示例中所有行为都组合在一起)。

假设我想通过添加一个名为CheckText 的新方法来扩展SelectList 类的功能。

传统的继承解决方案看起来像这样......

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

我想错了吗?

【问题讨论】:

标签: c# inheritance components


【解决方案1】:

我认为你想做这样的事情,但不确定这是否有帮助

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

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 2017-10-19
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多