gpt4 book ai didi

c# - 方法重载行为

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

我有以下代码示例:

public class Base
{
public virtual void MyMethod(int param)
{
Console.WriteLine("Base:MyMethod - Int {0}", param);
}
}

public class Derived1 : Base
{
public override void MyMethod(int param)
{
Console.WriteLine("Derived1:MyMethod - Int {0}", param);
}

public void MyMethod(double param)
{
Console.WriteLine("Derived1:MyMethod - Double {0}", param);
}
}

class Program
{
static void Main(string[] args)
{
Base objB = new Base();
objB.MyMethod(5);

Base objBD = new Derived1();
objBD.MyMethod(5);

Derived1 objD = new Derived1();
objD.MyMethod(5);

Console.ReadLine();
}
}

以上代码输出结果如下:

Base:MyMethod - Int 5

Derived1:MyMethod - Int 5

Derived1:MyMethod - Double 5

对于使用“objD”第三次调用“MyMethod”,为什么在我实际传递一个 INT 时使用“DOUBLE”重载。

使用“objBD”的第二次调用似乎表现正确。请提出建议。

最佳答案

奇怪的是,那天晚上我正在和乔恩讨论这个问题!有一个优先级问题——被覆盖的方法是在基类中定义的,所以为了“最佳方法”的目的,重载(即使是隐式转换)是更可取的,因为它是在最具体的类型(子类)。

如果您重新声明该方法 (new),那么它将获得优先级,但您不能overridenew a在同一类型中具有相同名称和签名的方法 - 您必须添加额外的继承级别才能实现此目的。

具体逻辑在 ECMA 334 v4 的 14.5.5 和 14.4.2 中有详细说明。

基本上,要使基本方法可调用,您要么必须转换为基本类型,要么添加一个 shim 方法:

public void MyMethod2(int param) {base.MyMethod(param);}

关于c# - 方法重载行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/377506/

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