gpt4 book ai didi

c# - C# 中多次转换的规则是什么?

转载 作者:行者123 更新时间:2023-11-30 14:43:13 25 4
gpt4 key购买 nike

我有这个代码片段,我想知道为什么输出会写在下面的评论中:

interface I {   
void m1();
void m2();
void m3();
}

class A : I {
public void m1() { Console.WriteLine("A.m1()"); }
public virtual void m2() { Console.WriteLine("A.m2()"); }
public virtual void m3() { Console.WriteLine("A.m3()"); }
}

class C : A, I {
public new void m1() { Console.WriteLine("C.m1()"); }
public override void m2() { Console.WriteLine("C.m2()"); }
public new void m3() { Console.WriteLine("C.m3()"); }
}

------
C c = new C();

((I) ((A) c)).m1(); //"C.m1()"
((I) ((A) c)).m2(); //"C.m2()"
((I) ((A) c)).m3(); //"C.m3()"

最初猜测输出应该是什么:

A.m1();
C.m2();
A.m3();

最佳答案

将类 C 更改为:

class C : A {
public new void m1() { Console.WriteLine("C.m1()"); }
public override void m2() { Console.WriteLine("C.m2()"); }
public new void m3() { Console.WriteLine("C.m3()"); }
}

Jeffrey Richter 的解释:

C# 编译器要求将实现接口(interface)的方法标记为公共(public)方法。这CLR 要求将接口(interface)方法标记为虚拟的。如果你没有明确标记源代码中的方法是虚拟的,编译器将方法标记为虚拟的并且密封;这可以防止派生类覆盖接口(interface)方法。如果你明确地将方法标记为虚拟,编译器将方法标记为虚拟(并保留它开封);这允许派生类覆盖接口(interface)方法。

如果接口(interface)方法是密封的,派生类就不能覆盖该方法。然而,一个派生类可以重新继承相同的接口(interface),并可以为接口(interface)的方法。在对象上调用接口(interface)的方法时,实现与对象的类型关联的被调用。

因为 C 类也实现了 I 接口(interface),所以当我们在 C 对象上调用接口(interface)方法时,我们将调用与对象类型相关的实现(即类 C 方法)而不是从 C 的基类(不是 A 类)派生的方法方法)。

关于c# - C# 中多次转换的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2236177/

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