gpt4 book ai didi

c# - 有没有派生类应该隐藏的情况......?

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

也许是个愚蠢的问题,但是假设 base class A 定义了一个 virtual method V,是否存在对 derived class 有意义的情况C 通过声明一个新的虚方法 C.V 来隐藏 A.V,它与 A.V 具有相同的签名:

class Program
{
static void Main(string[] args)
{
A a = new C();
a.Print(); // prints "this is in B class"

C c = new C();
c.Print();// prints "this is in C class"
}
}

class A
{
public virtual void Print()
{
Console.WriteLine("this is in A class");
}
}

class B:A
{
public override void Print()
{
Console.WriteLine("this is in B class");
}
}

class C : B
{
public virtual void Print()
{
Console.WriteLine("this is in C class");
}
}

谢谢

最佳答案

隐藏继承的虚拟不是故意设计的一部分。语言支持虚拟隐藏,使对象框架对 future 的变化更具弹性。

示例:对象框架 X 的第 1 版不提供 Print() 函数。 Bob 决定通过在他自己的后代类中定义 Print() 函数来扩展一些框架 X 对象。由于他计划在更具体的类中覆盖它们,因此他还使 Print() 函数成为虚拟函数。

随后,对象框架 X 的第 2 版发布。 Bob 决定升级他当前的项目以使用 Release 2 而不是 Release 1。Bob 不知道的是,对象框架 X 团队还认为 Print() 将是一个有用的函数,因此他们在其中一个项目中添加了一个虚拟 Print()框架的基类。

通过虚拟隐藏,Bob 的包含 Bob 的 Print() 实现的后代类应该可以正常编译和运行,即使基类中现在存在不同的 Print() - 即使具有不同的方法签名。了解基类 Print() 的代码将继续使用它,而了解 Bob 的 Print() 的代码将继续使用它。两者永远不会相遇。

如果没有虚拟隐藏,Bob 的代码将根本无法编译,直到他对源代码进行一些重要的手术以消除 Print() 上的名称冲突。有些人会争辩说这是“正确”的做法(拒绝编译),但实际上任何需要修改现有工作代码的基础库版本都不会受到客户的欢迎。他们会责怪框架破坏了一切并说坏话。

对于 Bob 来说,如果 Bob 的 print 遮盖了基本 Print 的编译器警告是合理的,但这不是 fatal error 。这是 Bob 应该尽快清理(通过重命名或删除他的 Print() 函数)以避免人为混淆的东西。

关于c# - 有没有派生类应该隐藏的情况......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240279/

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