声明为`override`的方法是否仍为“虚拟”?

时间:2017-03-10 00:56:59

标签: c#

是使用virtual class C1 { public virtual void MyMethod() { } } class C2: C1 { public override void MyMethod() { } } 声明的方法吗?

例如

MyMethod

C2中定义的virtual作为C1中定义的方法保留C2吗?即它是否可以被派生自<div class="Slideshow_carousel-wrapper container-fluid"> <span class="Slideshow-ctl-L" onclick="carousel_left()"></span> <div class="carousel slide" data-ride="carousel" ... </div> <span class="Slideshow-ctl-R" onclick="carousel_right()"></span> </div> <div class="container-fluid Slideshow_progress-bar"> <ul id="slideshow_progress" class="Slideshow_progress"></ul> </div> 的类中的方法覆盖?

如果没有,我该如何将其设为虚拟?

2 个答案:

答案 0 :(得分:4)

是的,您可以覆盖它,但是一旦seal它,那么如果您从密封版本派生,则不能再覆盖它:

public class C1 {

  public virtual void MyMethod() {
  }

}
public class C2 : C1 {
  public sealed override void MyMethod() {
     base.MyMethod();
  }
}

下面不起作用:

public class C3 : C2 {
  // here you will no longer be able to override it
}

但如果其他类派生C1,那仍然可以。

答案 1 :(得分:1)

是。您可以在后续子类中根据需要继续override次。

从C#5.0规范(我的重点):

  

可以在派生类中重写虚方法。当一个   实例方法声明包括一个override修饰符,即方法   覆盖具有相同签名的继承虚拟方法。而   虚方法声明引入了一个新方法,一个覆盖   方法声明专门用于现有的继承虚拟方法   提供该方法的新实现。

第10.6.5节讨论了CodingYoshi所指的内容,但它显示了一个可以做到的例子。