抽象方法和隐藏方法

本文关键字:方法 隐藏 抽象方法 | 更新日期: 2023-09-27 18:22:02

我正在努力更好地理解c#中的抽象类。

我知道在抽象类中,你必须重写抽象方法,也可以重写虚拟方法。。

我的问题是:

我可以覆盖非虚拟方法吗?(我知道通常我做不到,但也许抽象类不同?)还是会像隐藏一样?

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

抽象方法和隐藏方法

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

好的,那么让我们纠正你的错误,因为你对抽象类有一些完全错误的想法。

我知道在抽象类中,必须重写抽象方法,并且可以重写虚拟方法。

绝对不是;那句话的前半部分完全错了在抽象类中不需要重写抽象方法

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

  • 具体类必须用具体方法覆盖其所有抽象基类的所有抽象方法;它可以自己完成,也可以通过一个或多个基类完成

这应该是有意义的:在实现每个抽象方法之前,不能创建具体类的实例;否则,您可能会调用一个没有实现的方法,这将是糟糕的。

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

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

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

在我看来,因为非虚拟方法在编译时静态链接,并且不能更改——我将无法调用派生类中的方法,从来没有?

当然不是。通过将接收器转换为派生类,可以调用派生类的方法。

隐藏方法有什么意义?

复制:

隐藏方法是个好主意吗

这是一个你没有问的额外问题。看看你能不能回答。

一个方法可以标记为抽象和重写吗?如果没有,为什么不呢?如果是,举一个例子并解释你为什么要这样做

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

不,你不能。它们必须具有虚拟关键字。这里有一个很好的例子,类似于这个

我建议仔细研究一下OOP 可以做什么

关于你的问题,你只能覆盖一个虚拟类,另一个不隐藏方法的例子是:

但是,您可以使用继承来使用基类中的控件。这应该在两个类相关时进行,以防止创建重复的代码。

这方面的一个例子是一个人:人类,好吧,这里我们使用("type of":)来说明一个人是一种人类。这是继承的基本用途。

如果它们不相关,就不应该这样做,当你这样做的时候,这看起来可能会更快,然而,当你在3个月后回顾你的申请时,你会说";我为什么这么做&";。

一个例子是,这个基类有一个接近我想要的方法,你需要进行比较,它真的是吗<我真的应该这么做吗>

提供的msdn文章将为您提供进行此项工作所需的信息。享受OOP

您有一点误解:

在抽象类中,必须重写抽象方法,并且可以重写虚拟方法。

那句话应该是:

在派生自抽象类的具体类中,必须重写抽象方法,并且可以重写该类本身、其父类或子类中的虚拟方法。

您可以使用new关键字来隐藏非虚拟方法,或者隐藏,所以是的,它将隐藏而不是覆盖。

如果您在子类中隐藏了一个方法,然后想调用基类中出现的方法,请将子类强制转换为基类类型,如第二个示例中所做的那样。