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

Pos*_*Guy 5 c#

如果我有以下内容:

例如

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
     }
}
Run Code Online (Sandbox Code Playgroud)

所以我没有在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();
}
Run Code Online (Sandbox Code Playgroud)

那么我们还有:

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();
      ...
 }
Run Code Online (Sandbox Code Playgroud)

所以在继承ClassC的一些类中调用ClassA.PerformTransaction().

Ree*_*sey 0

那么我猜这是如何运作的?我的意思是它在这里调用堆栈顶部的方法(调用 ClassB 的重写方法,然后在我的 ClassC 的 ClassB 方法的重写中包含逻辑?)

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

您可能找不到的直接用法,ClassB.ValidateTransaction()因为没有调用此函数的实例ClassB(定义为)。ClassB然而,任何调用都将通过线路ClassC间接使用。ClassB.ValidateTransaction()base.ValidateTransaction()