抽象方法和隐藏方法

nat*_*ati 1 c# abstract-class method-hiding

我试图更好地理解c#中的抽象类.

我知道在抽象类中你必须覆盖抽象方法并且可以覆盖虚方法.

我的问题是:

我可以覆盖非虚拟方法吗?(我知道通常我不能 - 但也许抽象类不同?)或者它会隐藏吗?

另外,正如我在这里读到的如何强制调用C#派生方法(第一个答案) - 在我看来,因为非虚拟方法在编译时静态链接而且无法更改 - 我无法调用方法在派生类中,从来没有?如果是这样 - 隐藏方法有什么意义?

Eri*_*ert 13

我试图更好地理解c#中的抽象类.

好的,然后让我们纠正你的错误,因为你对这里的抽象类有一些完全错误的想法.

我知道在抽象类中你必须覆盖抽象方法并且可以覆盖虚方法.

绝对不; 那句话的第一部分是完全错误的.抽象类中没有任何要求可以覆盖抽象方法.

非抽象类称为具体类.真正的规则是:

  • 具体类必须使用具体方法覆盖其所有抽象基类的所有抽象方法; 它可以通过自身或通过一个或多个基类来实现.

这应该是有道理的:在实现每个抽象方法之前,你不能创建具体类的实例; 否则你可以调用一个没有实现的方法,那会很糟糕.

  • 任何派生类都可以覆盖其任何基类的非密封虚方法.

我可以覆盖非虚拟方法吗?

不可以.您可以重载非虚方法,也可以隐藏现有的非虚方法,但不能覆盖它们.

在我看来,因为非虚拟方法在编译时静态链接而且无法更改 - 我无法在派生类中调用方法,从不?

当然不是.通过将接收器转换为派生类来调用派生类的方法.

隐藏方法有什么意义?

重复:

方法隐藏是一个好主意

这是你没有问过的奖金问题.看看你是否可以回答它.

方法可以标记为抽象和覆盖吗?如果不是,为什么不呢?如果是的话,举个例子说明你想要的原因.

如果你能正确回答这个问题,那么你可能对抽象方法有了很好的理解.解决方案就在这里.