Из-за того, что мой код застрял в проблеме множественного / алмазного наследования, я пытался изучить и переключиться на более сложный шаблон.
Несмотря на все мои усилия, я на самом деле не «понимаю», что касается моего кода. Вместо того, чтобы иметь все в базовом классе, я пытался думать о поведении, которое можно разделить на другие компоненты.
Проблема в том, что я не знаю, чтобы сделать класс или компоненты расширяемыми.
Это пример моего кода ...
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
. Тогда каждый экземпляр SelectList
будет раскрывать тот метод, который мне не обязательно нужен.
Я думаю об этом неправильно?