梳理一下static、abstract、virtual、override和new之间的关系
①static类里的所有成员都应该是static的,且不能被继承,static的方法也不能加abstract或virtual;
但是在非static类里面的static方法可以在子类中被同名方法覆盖,
//父类 public class ClassBase { public static string A(){return "ClassBase.StaticA";}//父类静态方法 } //子类 public class ClassSon :ClassBase { public new string A()//使用new来覆盖,否则编译器提示警告,且该方法也可以申明为static { return "ClassSon.A"; } }
②abstract的方法和属性必须包含在abstract的类中,abstract的方法不能有方法体,即不能有任何实现,而是在子类中实现,且子类中实现该方法时必须加override;
//父类 public abstract class ClassBase { public abstract string A();//不能包含实现,且必须是抽象类成员 } //子类 public class ClassSon:ClassBase { public override string A()//必须加override { return "Son.A"; } }
②virtual的方法和属性有方法体,有自己的实现,可以在其子类中使用new或override来重写,其区别如下
//父类 public class ClassBase { public virtual string A() { return "ClassBase.A"; } } //使用new的子类 public class ClassSon1:ClassBase { public new string A() { return "ClassSon1.A"; } } //使用override的子类 public class ClassSon2:ClassBase { public override string A() { return "ClassSon2.A"; } } //client代码 public class Client { static void Main(string[] args) { ClassBase cb1 = new ClassSon1(); ClassBase cb2 = new ClassSon2(); Console.WriteLine(cb1.A()); Console.WriteLine(cb2.A()); } }
运行结果为:
ClassBase.A
ClassSon2.A
③另外,没申明为virtual的方法,也可以在子类中使用new重写,效果跟上面第二点中使用new的效果一样,当然不使用new也可以,不过编译器会给出警告。