在该方法的覆盖中调用基本抽象方法

如果我有以下内容:

例如

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 } } 

所以我没有在ClassC的ValidateTransaction上找到用法。 我没有看到它在任何地方被调用。

那么我想这是怎么回事? 我的意思是它在这里调用堆栈顶部的方法(调用ClassB的覆盖方法,然后在ClassC的ClassB的方法中包含逻辑?)

这对我来说没有意义,为什么或如何运作或这里的意图。

更新

好的,我确实找到了一个地方,从我们项目中的很多子类调用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(); ... } 

所以在inheritanceClassC的一些类中调用ClassA.PerformTransaction()。

好吧,它调用了ClassC的覆盖方法……这恰好调用了ClassB的实现。 它不是直接在ClassC的编译代码中“包含”ClassB的实现逻辑,或类似的东西 – 它只是另一种方法调用。

现在还不完全清楚是什么令你感到困惑 – 行为,设计意图或Find Usages向您展示的内容。

请注意,尽管您的主题行,您没有调用“基本抽象方法” – 您正在调用该方法的实现 。 编译器知道ClassC派生自ClassB,ClassB提供了该方法的实现,因此它显式地进行了调用。 你不能从ClassB本身做同样的事情,因为那时base.ValidateTransaction真的试图调用一个抽象的基本方法。

有趣的事实:尽管这称为虚拟方法,但它是一个非虚方法调用:编译器知道要使用的确切实现,并将其加入调用。 如果虚拟呼叫,你最终会回到ClassC实现中,因为它会覆盖它:)

当调用C类覆盖时,它将首先调用B的覆盖并在那里执行一些逻辑,然后由C的逻辑扩展。

我知道他们可以使用相同的变量数据。 我不知道,因为我没有所有的数据。

那么我想这是怎么回事? 我的意思是它在这里调用堆栈顶部的方法(调用ClassB的覆盖方法,然后在ClassC的ClassB的方法中包含逻辑?)

是的,基本上就是这样。 当您在ClassC的实例上调用ValidateTransaction时,它的方法就会运行。 然后,它显式执行基类( ClassB )方法,然后添加自己的附加validation。

你可能没有找到ClassB.ValidateTransaction() 直接用法,因为没有ClassB (定义为ClassB )的实例,在这个实例上调用它。 但是,任何ClassC调用都将通过base.ValidateTransaction()行间接使用ClassB.ValidateTransaction()