由于我的代码被多重/钻石继承问题所困扰,我一直在尝试学习并切换到更多的合成模式。
尽管我付出了最大的努力,但我并没有真正做到这一点'因为它与我的代码有关。我没有把所有东西放在基类中,而是试图想到可以分解成其他组件的行为。
问题是我不知道如何使类或组件可扩展。
这是我的代码的一个例子......
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
的每个实例都会公开我可能不一定想要的方法。
我在想这个错吗?
答案 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