抽象方法和隐藏方法

时间:2013-07-12 10:47:55

标签: c# abstract-class method-hiding

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

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

我的问题是:

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

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

4 个答案:

答案 0 :(得分:13)

  

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

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

  

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

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

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

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

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

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

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

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

  

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

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

  

隐藏方法有什么意义?

重复:

Is method hiding ever a good idea

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

  

方法是否可以标记为抽象和覆盖?如果不是,为什么不呢?如果是,请举例说明您想要的原因。

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

答案 1 :(得分:2)

不,你不能。他们必须拥有虚拟关键字。 Good example here,similar This one as well

答案 2 :(得分:0)

我建议您仔细研究一下OOP

可以做些什么

在提到你的问题时,你只能覆盖一个虚拟类,另一个例子而不是隐藏方法:

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

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

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

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

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

答案 3 :(得分:0)

你有一点误会:

  

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

那句话应该是:

  

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

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

如果在子类中隐藏方法,然后想要调用基类中出现的方法,则将子类强制转换为基类类型,如第二个示例here中所做。