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