是否可以确定虚拟方法是否已被重写:
class ABase {
public void DoSomething(object p)
{
p.Process();
if( /* DoSomethingExtra is implemented */ )
DoSomethingExtra(p);
}
public virtual void DoSomethingExtra(object p) { }
}
class ADerived {
public override void DoSomethingExtra(object p)
{
p.ProcessMore();
}
}
我意识到这个例子看起来很愚蠢(例如,为什么不直接调用 DoSomethingExtra() 因为它没有做任何事情)。我向你保证我有一个合法的理由。有任何想法吗?
因此,在 C# 中,可以声明虚拟方法而不实现它。
这不可能。您可以将方法声明为abstract,但如果该方法是虚拟的,它将有一些实现(即使该实现实际上是一个空操作)。
您上面的代码报告了错误Error 1 'ABase.DoSomethingExtra(object)' must declare a body because it is not marked abstract, extern, or partial
.
处理此问题的典型方法是仅声明具有 null 操作实现的方法,然后调用它:
class ABase {
public void DoSomething(object p)
{
p.Process();
DoSomethingExtra(p); // Always call
}
public virtual void DoSomethingExtra(object p)
{
// Do nothing here
}
}
编辑:既然您的问题已被编辑,我将为您提供与您的编辑相关的更多信息,特别是:
我意识到这个例子看起来很愚蠢(例如,为什么不直接调用 DoSomethingExtra() 因为它没有做任何事情)。我向你保证我有一个合法的理由。有任何想法吗?
没有直接的方法可以确定当前实例是否覆盖了您的虚拟方法。这可能需要一些非常讨厌的、难以维护的代码,例如检查方法体通过反射声明类型 https://stackoverflow.com/questions/2932421/detect-if-a-method-was-overridden-using-reflection-c/2932448#2932448看看那里有什么。
话虽这么说,我强烈质疑这里的设计目标。你的问题基本上是在询问一种违反的具体方式里氏替换原则 http://en.wikipedia.org/wiki/Liskov_substitution_principle,这是面向对象编程的核心原则之一。这将会降低你的代码的性能和可维护性......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)