我正在尝试更好地理解c#中的抽象类。
我知道在抽象类中你必须覆盖抽象方法,并且可以覆盖虚方法。
我的问题是:
我可以覆盖非虚拟方法吗? (我知道通常我不能 - 但也许抽象类不同?)或者它会隐藏吗?
另外,正如我在这里阅读How to force call a C# derived method(第一个答案) - 在我看来,因为非虚拟方法在编译时静态链接而且无法更改 - 我无法调用方法在派生类中,从来没有?如果是这样 - 隐藏方法有什么意义?
答案 0 :(得分:13)
我正在尝试更好地理解c#中的抽象类。
好的,然后让我们纠正你的错误,因为你在这里对抽象类有一些完全错误的想法。
我知道在抽象类中你必须覆盖抽象方法并且可以覆盖虚方法。
绝对不是;那句话的第一部分是完全错误的。 抽象类中没有任何要求可以覆盖抽象方法。
非抽象类称为具体类。真正的规则是:
这应该是有意义的:在实现每个抽象方法之前,你不能创建具体类的实例;否则你可以调用一个没有实现的方法,那会很糟糕。
我可以覆盖非虚拟方法吗?
没有。您可以重载非虚方法,也可以隐藏现有的非虚方法,但不能覆盖它们。
在我看来,因为非虚拟方法在编译时静态链接而且无法更改 - 我无法在派生类中调用方法,从不?
当然不是。通过将接收器转换为派生类来调用派生类的方法。
隐藏方法有什么意义?
重复:
Is method hiding ever a good idea
这是你没有问过的奖金问题。看看你是否可以回答它。
方法是否可以标记为抽象和覆盖?如果不是,为什么不呢?如果是,请举例说明您想要的原因。
如果你能正确回答这个问题,那么你可能对抽象方法有了很好的理解。解决方案是here。
答案 1 :(得分:2)
答案 2 :(得分:0)
我建议您仔细研究一下OOP
可以做些什么在提到你的问题时,你只能覆盖一个虚拟类,另一个例子而不是隐藏方法:
但是,您可以使用继承来使用基类中的控件。这两个类相关时应该这样做,以防止创建重复的代码。
这个的一个例子是个人:人类,好吧所以我们在这里使用('type of':)表明一个人是一种人类。这是继承的基本用法。
如果它们不相关则不应该这样做,当你这样做时看起来似乎更快,但当你回顾你的应用程序3个月时,你会说“为什么我这样做?”。
这方面的一个例子是,这个基类有一个接近我要找的方法,你需要做一个比较,是吗真的? 我应该真的这样做吗?
提供的msdn文章将为您提供进行此操作所需的信息。享受OOP
答案 3 :(得分:0)
你有一点误会:
在抽象类中,你必须覆盖抽象方法,并且可以覆盖虚方法。
那句话应该是:
在从抽象类派生的具体类中,您必须覆盖抽象方法,并且可以覆盖虚拟方法,无论是在该类本身,其父类之一还是其子类之一。
您可以使用new
关键字来遮蔽或隐藏非虚拟方法,所以是的,它会隐藏而不是覆盖。
如果在子类中隐藏方法,然后想要调用基类中出现的方法,则将子类强制转换为基类类型,如第二个示例here中所做。