gpt4 book ai didi

c# - 调用基本方法而不是覆盖

转载 作者:太空狗 更新时间:2023-10-29 23:00:13 25 4
gpt4 key购买 nike

在 C# 中,类 A 包含一个公共(public)方法 Foo(),它会执行一些处理并返回一个值。 protected 方法 Bar(),也在类 A 中执行与 Foo() 相同的逻辑,后面是一些额外的处理,然后返回一个值。

为了避免重复代码,Bar() 调用了 Foo() 并将返回值用作中间值。

class A
{
public virtual String Foo()
{
String computedValue;
// Compute the value.
return computedValue;
}

protected String Bar()
{
String computedValue;
String intermediateValue = Foo();
/// More processing to create computedValue from intermediateValue.
return computedValue;
}
}

B 继承自 A 并覆盖 Foo()。覆盖调用 Bar() 的基类实现。

class B : A
{
public override String Foo()
{
base.Bar();
}
}

这(当然)会进入无限循环,直到计算机内存不足,然后产生堆栈溢出异常。

最明显的解决方案是用包含 Foo 内部结构的私有(private) FooInternals 方法重写 A。然后修改 Foo 和 Bar 以使用该方法的结果。

有没有办法强制 A 的 Bar() 调用 A 的 Foo() 而不是覆盖?

(我在这里几乎可以肯定是太聪明了;这完全违背了多态性。但我无法抗拒尝试进一步扩展我的知识的冲动。)

最佳答案

Is there a way to force A's Bar() to call A's Foo() instead of the override?

不直接。最简单的重构是将 Foo 更改为:

public virtual string Foo()
{
return FooImpl();
}

private string FooImpl()
{
String computedValue;
// Compute the value.
return computedValue;
}

然后更改 Bar 以调用 FooImpl 而不是 Foo

(这可能是您在“最明显的解决方案”段落中的意思 - 恐怕我在第一次阅读时错过了这一点。)

从根本上说,这只是继承存在问题的领域之一。当一个虚拟方法调用另一个虚拟方法时,需要对其进行记录,以便子类可以避免引起问题 - 即使感觉它应该是一个实现细节。正是这种事情让我更喜欢组合而不是继承——当然,两者都是合理的选择。

关于c# - 调用基本方法而不是覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16548762/

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