【发布时间】: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 的每个实例都会公开我可能不一定想要的方法。
我想错了吗?
【问题讨论】:
-
对于您给出的示例,扩展方法可以很好地工作。如果您需要在扩展中获得更复杂的功能,装饰器模式可能会帮助您en.wikipedia.org/wiki/Decorator_pattern
标签: c# inheritance components