gpt4 book ai didi

c# - c#中的类转换

转载 作者:行者123 更新时间:2023-12-03 22:42:27 25 4
gpt4 key购买 nike

这是c#代码

class A {
public int Foo(){ return 5;}
public virtual int Bar(){return 5;}
}
class B : A{
public new int Foo() { return 1;} //shadow
public override int Bar() {return 1;} //override
}

输出

Console.WriteLine(((A)clB).Foo()); // output 5 <<<--
Console.WriteLine(((A)clB).Bar()); // output 1

我们如何得到这个输出。谁能在这里解释一下类转换过程。

更新:

这如何显示阴影和覆盖之间的区别

最佳答案

我假设

var clB = new B();

FooBar 方法的区别在于,虽然 Bar 使用继承和多态性来决定调用什么实现,但是 Foo 方法隐藏了它的原始实现。

一句话,A.Foo()B.Foo()完全没有关系,只是碰巧同名而已。当编译器发现 A 类型的变量调用 Foo 时,它会进入并执行 A.Foo(),因为该方法不是虚拟的,所以它不能被覆盖。类似地,当它看到 B 类型的变量调用 Foo 时,它会执行 B.Foo(),而不管实例的实际类型包含在变量中。

另一方面,Bar 方法被定义为虚拟的,继承类可以(并且应该)覆盖它的实现。因此,每当对 Bar 进行调用时,无论它是来自声明为 A 还是 B 的变量,该方法实际上是必须在调用对象本身的层次结构中找到被调用的“最新”实现,并且不受用于引用该对象的变量类型的影响。

关于c# - c#中的类转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731300/

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