【问题标题】:What is a difference between abstract and virtual? [duplicate]抽象和虚拟之间有什么区别? [复制]
【发布时间】:2011-01-28 02:57:24
【问题描述】:

abstract 和 virtual 都将在子类中被覆盖,这有什么区别。

虚拟方法是否有主体和抽象只是一个签名????

【问题讨论】:

  • 顺便说一句,与抽象方法相比,部分方法允许您创建不需要重写的实现方法。

标签: c#


【解决方案1】:

是不是虚拟方法有主体,抽象只是一个签名????

没错。关键是虚拟方法可以在派生类中被覆盖,而抽象方法必须被覆盖。同样,具有至少一个抽象方法的类本身必须是抽象的,即它不能直接实例化,因为它的实现(部分)缺失。

最后,每个抽象方法隐含地是虚拟的。 virtual 基本上只是意味着该方法在运行时被分派给正确的类,因此可以重写它以实现运行时多态。

【讨论】:

  • 由于抽象方法必须被覆盖,它们实际上是类似于接口的合约,除非您正确实现它们,否则代码将编译,因此这是一种让您的代码用户实现他们必须执行的代码的方法实施,尤其是在他们懒惰的情况下,对吗?
  • @Xaisoft 正确,但是虚拟(非抽象)方法也形成了契约,因为契约是从使用类(=客户端)的角度来看的。重要的是客户端可以使用它所宣传的类的功能。
  • 我同意,但我的意思是,如果您声明一个虚拟方法,客户端不必实现它,即使他们应该实现它。虚拟方法也可以具有默认行为。客户端必须实现一个抽象方法,并且它不能有默认行为。似乎您选择抽象路由与虚拟路由的唯一原因是,如果您真的想强制实施一种方法并将责任放在客户端身上。
  • @Xaisoft 啊,是的。就是这样。
【解决方案2】:

抽象意味着您必须覆盖它。虚拟意味着您可以覆盖它。或多或少。

【讨论】:

  • 补充:在你的类中使用抽象方法,你的整个类将是抽象的,这意味着你不能创建这个类的实例,只能创建派生的非抽象子类。
【解决方案3】:

我同意这里的两个答案,所以我不会重复它们。但这里有一个链接可能会有所帮助。

10.6.3 Virtual, sealed, override, and abstract accessors

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 2011-09-08
    • 1970-01-01
    • 2010-11-13
    • 2013-02-17
    • 2016-09-05
    • 2021-09-11
    相关资源
    最近更新 更多