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模式可能会帮助您