1

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

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

我的问题是:

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

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

4

4 回答 4

14

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

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

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

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

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

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

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

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

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

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

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

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

隐藏方法有什么意义?

副本:

隐藏方法是个好主意吗

这是一个您没有问的奖励问题。看看你能不能回答。

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

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

于 2013-07-12T13:58:52.293 回答
2

不,你不能。他们必须有虚拟关键字。很好的例子,类似的这个也是

于 2013-07-12T10:49:56.537 回答
0

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

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

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

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

如果它们不相关,则不应该这样做,当你这样做时这似乎更快,但是当你回顾你的应用程序 3 个月时,你会说“我为什么这样做?”。

这方面的一个例子是,这个基类有一个接近我正在寻找的方法,你需要进行比较,是真的吗?我真的应该这样做吗?

提供的 msdn 文章将为您提供进行此操作所需的信息。享受面向对象

于 2013-07-12T10:55:09.310 回答
0

你有个小误解:

在抽象类中,您必须覆盖抽象方法并且可以覆盖虚拟方法。

那句话真的应该是:

在派生自抽象类的具体类中,您必须覆盖抽象方法并且可以覆盖虚拟方法,无论是在该类本身、其父类之一或其子类之一中。

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

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

于 2013-07-12T14:47:25.550 回答