У меня есть абстрактный базовый класс, из которого происходит множество классов.Я хочу, чтобы производные классы могли переопределять виртуальный метод, определенный в базовом классе, но в базовом классе есть сложная логика, которая определяет, «включен» ли переопределенный метод в любой конкретный момент.код - одно из возможных решений - например:
public abstract class AbstractBaseClass
{
public bool IsMethodEnabled { get; set; }
public virtual void DerivedMethod() { }
public void Method()
{
if (IsMethodEnabled)
DerivedMethod();
}
}
public class DerivedClass : AbstractBaseClass
{
public override void DerivedMethod()
{
Console.WriteLine("DerivedMethod() was called.");
}
}
В приведенном выше примере IsMethodEnabled
является сокращением для более сложной логики, которая определяет, следует ли вызывать DerivedMethod
- это код, который я хочуинкапсулирован в базовый класс, так что мне не нужно воспроизводить его в каждом производном классе.
Дизайн работает так, как задумано.Если я запускаю этот пример кода:
AbstractBaseClass a1 = new DerivedClass() { IsMethodEnabled = false };
AbstractBaseClass a2 = new DerivedClass() { IsMethodEnabled = true };
a1.Method();
a2.Method();
... Я вижу ровно один вызов DerivedMethod
, как и ожидалось.
Но что-то не так меня раздражает в этой реализации.Я чувствую, что должен быть более элегантный способ справиться с этим.Есть ли лучший способ выборочно вызвать реализацию метода производного класса из его абстрактного базового класса?Есть ли шаблон дизайна, который бы мне здесь лучше служил?
Другими словами, пахнет ли код выше?