gpt4 book ai didi

c# - 有没有更好的方法从派生类的抽象基类调用派生类的重写方法?

转载 作者:太空狗 更新时间:2023-10-29 21:14:16 24 4
gpt4 key购买 nike

我有一个抽象基类,从中派生出许多类。我希望派生类能够覆盖基类中定义的虚拟方法,但基类中有复杂的逻辑来确定在任何特定时刻是否“启用”被覆盖的方法。

考虑这段代码——一种可能的解决方案——例如:

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 的一次调用,正如预期的那样。

但是这个实现让我有些不对劲。我觉得必须有一种更优雅的方式来处理这个问题。有没有更好的方法从派生类的抽象基类中选择性地调用派生类的方法实现?有没有更适合我的设计模式?

换句话说,上面的代码“有味道”吗?

最佳答案

这是一个非常合理的实现。

我建议的主要更改是:

  • 将实现功能的虚方法设置为protected而不是public
  • 为此使用更合适的命名。也许更像是 public void Method()protected virtual void OnMethod()

关于c# - 有没有更好的方法从派生类的抽象基类调用派生类的重写方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7409824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com