What is a difference between abstract and virtual?
抽象类和虚拟类都将在子类中被重写,而不是有什么区别。
虚方法有主体,抽象只是签名吗?????
- 作为旁白,与抽象方法不同,分部方法允许创建不需要重写的实现的方法。
is it Virtual method have body and abstract is just a signature ????
确切地。关键是虚拟方法可以在派生类中被重写,而抽象方法必须被重写。同样,具有至少一个抽象方法的类本身必须是抽象的,即它不能直接实例化,因为它的实现(部分)丢失。
最后,每一种抽象方法都是隐含的虚拟方法。virtual基本上只是意味着方法在运行时被调度到正确的类,因此它可以被重写以实现运行时多态性。
- 因为抽象方法必须被覆盖,事实上,它们是一个契约式的接口,除非您正确地实现它们,否则代码将被编译,所以这是一种让代码的用户实现他们必须实现的代码的方法,特别是如果他们懒惰、正确的话?
- @xaisft正确,但虚拟(非抽象)方法也构成契约,因为契约是从使用类(即客户机)的角度出发的。重要的是客户机可以使用它所宣传的类的函数。
- 我同意,但我的意思是,如果您声明一个方法为虚拟的,客户机不必实现它,即使他们应该实现。另外,虚拟方法也可以具有默认行为。客户端必须实现抽象方法,并且不能有默认行为。看起来,与虚拟路由相比,使用抽象路由的唯一原因是,如果您真的想要强制实现一个方法,并且将责任放在客户机上。
- @是的。就是这样。
抽象意味着您必须重写它。虚拟意味着您可以覆盖它。或多或少。
- 另外:对于类中的抽象方法,您的整个类将是抽象的,这意味着您不能创建此类的实例,而只能创建派生的非抽象子类的实例。
我同意这两个答案,所以我不会重复。但这里有一个链接可能会有所帮助。
10.6.3虚拟、密封、重写和抽象访问器