如果我有以下情况:
e.g.
public abstract class ClassA
{
protected abstract void ValidateTransaction();
}
public abstract class ClassB : ClassA
{
protected override void ValidateTransaction()
{
// some custom logic here
}
}
public class ClassC : ClassB
{
protected override void ValidateTransaction()
{
base.ValidateTransaction();
// some additional custom logic here
}
}
So 我没有找到ClassC的ValidateTransaction的用法。我没有看到它在任何地方被调用。
那么我猜这是如何运作的?我的意思是它在这里调用堆栈顶部的方法(调用 ClassB 的重写方法,然后在我的 ClassC 的 ClassB 方法的重写中包含逻辑?)
这对我来说没有意义,为什么、如何运作或这里的意图。
UPDATED
好的,我确实找到了从我们项目中的许多子类调用 ClassA 的 PerformTransaction() 方法的地方。
所以 ClassA 现在看起来像这样,在这里为您提供更多详细信息:
public abstract class ClassA
{
public void PerformTransaction()
{
ValidateTransaction();
// and calls some other code here.
}
protected abstract void ValidateTransaction();
}
好吧,那么我们还有:
public abstract class ClassB : ClassA
{
protected override void ValidateTransaction()
{
// some custom logic here
}
}
public class ClassC : ClassB
{
protected override void ValidateTransaction()
{
base.ValidateTransaction();
// some additional custom logic here
}
}
public class SomeAbritraryClass : ClassC
{
ClassA.PerformTransaction();
...
}
因此 ClassA.Perform Transaction() 在继承 Class 的一些类中被调用。
好吧,它调用了 ClassC 的重写方法……而该方法恰好调用了 ClassB 的实现。它并不是直接将 ClassB 的实现逻辑“包含”在 ClassC 的编译代码中,或者类似的东西 - 它只是另一个方法调用。
目前尚不完全清楚是什么让您感到困惑 - 行为、设计意图或“查找用法”向您展示的内容。
请注意,尽管您有主题行,但您not调用“基本抽象方法” - 您正在调用执行该方法的。编译器知道 ClassC 派生自 ClassB,后者提供了该方法的实现,因此它显式地进行该调用。你不能从 ClassB 本身做同样的事情,因为那样的话base.ValidateTransaction
really would尝试调用抽象基方法。
有趣的事实:尽管这是调用虚拟方法,但它是非虚拟方法调用:编译器知道要使用的确切实现,并将其烘焙到调用中。如果它was虚拟调用,您最终会回到 ClassC 实现,因为它会覆盖它:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)