- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在下面的代码中:
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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!