2.1 实现继承和接口继承
实现继承:一个类型派生于一个基类型,它用于基类型的所有成员字段和函数.
class BaseClass { public string UserName = "C#"; public static string GetUserName() { return ""; } } class ImpleteClass:BaseClass { public string PrintName() { return GetUserName(); //return UserName } }
ImpleteClass类继承BaseClass,就可以用基类中所有的成员字段如UserName,GetUserName();
接口继承 表示一个类型只继承了函数的签名,没有继承任何实现代码.在需要制定该类型具有某些可用的特性时,最好
使用这种类型的继承.
2.2 多重继承
C#不支持多重实现继承.但C#允许类型派生自多个接口---多重接口继承.这说明
C#类可以派生自另一个类和任意多个接口.
2.3 Virtual关键字
virtual 关键字用于在基类中修饰方法。virtual的使用会有几种情况:
1, 如果方法不是virtual的,编译器就使用声明的类对应的类型,也就是说,不是virtual的,在编译时候,就定了。比如下面的例子:子类的方法都没有执行,执行的全部都是父类的方法。运行的结果是
father
boy
girl
public class ClassFather { public string s1; public void VirFun() { Console.WriteLine(s1); } } public class ClassBoy : ClassFather { public new void VirFun() { base.VirFun(); } } public class ClassGirl : ClassFather { public new void VirFun() { base.VirFun(); Console.WriteLine(s1); } } public class Test { public static void Main() { ClassFather a = new ClassFather(); a.s1 = "father"; a.VirFun(); ClassFather b = new ClassBoy(); b.s1 = "boy"; b.VirFun(); ClassFather c = new ClassGirl(); c.s1 = "girl"; c.VirFun(); Console.ReadKey(); } }
2, 如果方法是Virtual的,然后子类使用了override, 编译器就生产代码。然后,在运行的时候,进行检测,看对象属于哪个类,然后调用这个类的方法。运行的结果是
father
boy
girl
girl
public class ClassFather { public string s1; public virtual void VirFun() { Console.WriteLine(s1); } } public class ClassBoy : ClassFather { public override void VirFun() { base.VirFun(); } } public class ClassGirl : ClassFather { public override void VirFun() { base.VirFun(); Console.WriteLine(s1); } } public class Test { public static void Main() { ClassFather a = new ClassFather(); a.s1 = "father"; a.VirFun(); ClassFather b = new ClassBoy(); b.s1 = "boy"; b.VirFun(); ClassFather c = new ClassGirl(); c.s1 = "girl"; c.VirFun(); Console.ReadKey(); } }
3,如果一个父类的方法是virtual,子类不是用override,而是用new来覆盖了,那么运行子类的时候,还是执行声明的类的方法。比如下面的例子中,girl类对象就是。
father
boy
girl
public class ClassFather { public string s1; public virtual void VirFun() { Console.WriteLine(s1); } } public class ClassBoy : ClassFather { public new void VirFun() { base.VirFun(); } } public class ClassGirl : ClassFather { public new void VirFun() { base.VirFun(); Console.WriteLine(s1); } } public class Test { public static void Main() { ClassFather a = new ClassFather(); a.s1 = "father"; a.VirFun(); ClassFather b = new ClassBoy(); b.s1 = "boy"; b.VirFun(); ClassFather c = new ClassGirl(); c.s1 = "girl"; c.VirFun(); Console.ReadKey(); } }
时间: 2024-10-13 14:48:45