在该方法的重写中调用该方法的基本抽象方法

2023-12-21

如果我有以下情况:

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(使用前将#替换为@)

在该方法的重写中调用该方法的基本抽象方法 的相关文章

随机推荐