C# 组合重于继承-如何使组件可扩展?

C# 组合重于继承-如何使组件可扩展?,c#,inheritance,components,C#,Inheritance,Components,由于我的代码受到多重/菱形继承问题的困扰,我一直在尝试学习并切换到更多的组合模式 尽管我尽了最大的努力,但我并没有真正“理解”,因为它与我的代码有关。我没有把所有的东西都放在一个基类中,而是一直在尝试思考可以拆分为其他组件的行为 问题是我不知道如何使类或组件可扩展 这是我的代码的一个例子 public class SelectList : BaseControl { private ISelectListActions SelectActions { get; } public

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

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

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

这是我的代码的一个例子

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
的每个实例都将公开我可能不需要的方法


我想错了吗

我想你想做这样的事情,但不确定这是否有用

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

对于您给出的示例,扩展方法将非常有效。如果您需要在扩展中获得更复杂的功能,decorator模式可能会帮助您