gpt4 book ai didi

c# - 为什么这行得通?方法重载+方法覆盖+多态

转载 作者:可可西里 更新时间:2023-11-01 08:20:16 25 4
gpt4 key购买 nike

在下面的代码中:

public abstract class MyClass
{
public abstract bool MyMethod(
Database database,
AssetDetails asset,
ref string errorMessage);
}

public sealed class MySubClass : MyClass
{
public override bool MyMethod(
Database database,
AssetDetails asset,
ref string errorMessage)
{
return MyMethod(database, asset, ref errorMessage);
}

public bool MyMethod(
Database database,
AssetBase asset,
ref string errorMessage)
{
// work is done here
}
}

其中 AssetDetails 是 AssetBase 的子类。

为什么第一个 MyMethod 在传递 AssetDetails 时在运行时调用第二个,而不是陷入递归的无限循环?

最佳答案

C# 将解析您对其他实现的调用,因为调用对象上的方法时,该对象的类有自己的实现,而不是重写或继承的实现。

这可能会导致微妙且难以发现的问题,就像您在此处显示的那样。

例如,尝试这段代码(首先阅读它,然后编译并执行它),看看它是否按照您的预期执行。

using System;

namespace ConsoleApplication9
{
public class Base
{
public virtual void Test(String s)
{
Console.Out.WriteLine("Base.Test(String=" + s + ")");
}
}

public class Descendant : Base
{
public override void Test(String s)
{
Console.Out.WriteLine("Descendant.Test(String=" + s + ")");
}

public void Test(Object s)
{
Console.Out.WriteLine("Descendant.Test(Object=" + s + ")");
}
}

class Program
{
static void Main(string[] args)
{
Descendant d = new Descendant();
d.Test("Test");
Console.In.ReadLine();
}
}
}

请注意,如果您将变量的类型声明为 Base 而不是 Descendant 类型,调用将转到另一个方法,请尝试更改此行:

Descendant d = new Descendant();

对此,并重新运行:

Base d = new Descendant();

那么,您实际上将如何设法调用 Descendant.Test(String)

我的第一次尝试是这样的:

public void Test(Object s)
{
Console.Out.WriteLine("Descendant.Test(Object=" + s + ")");
Test((String)s);
}

这对我没有好处,而只是一次又一次地调用 Test(Object) 以最终导致堆栈溢出。

但是,下面的工作。因为,当我们将 d 变量声明为 Base 类型时,我们最终调用了正确的虚方法,我们也可以求助于这个技巧:

public void Test(Object s)
{
Console.Out.WriteLine("Descendant.Test(Object=" + s + ")");
Base b = this;
b.Test((String)s);
}

这将打印出:

Descendant.Test(Object=Test)
Descendant.Test(String=Test)

你也可以从外面做到这一点:

Descendant d = new Descendant();
d.Test("Test");
Base b = d;
b.Test("Test");
Console.In.ReadLine();

将打印出相同的内容。

但是首先需要意识到问题,这完全是另一回事。

关于c# - 为什么这行得通?方法重载+方法覆盖+多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1833216/

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