总结一下使用类继承和多态时,实例化顺序以及方法继承重写中new,virtual、abstract、override的用法和规则:
继承关系:实例化对象时,作用类型范围在基类到具体实例对象类之间(中间包括父类子类,成员访问权限:private、protected、public):
1、 在子类构造器必须指定拥有父类访问权限的构造器:base(xxx),默认无参构造器;
2、 先实例化基类,再实例化子类,再子类的子类....最后到要实例的对象(构造函数执行顺序先父后子...);
3、 在运行方法时,就运行当前所属类型中的方法:
1).当遇到覆盖new方法,说明覆盖父类方法,该方法与父类不具重写关系视为新方法,仍然运行当前所属类型中的方法;
2).当遇到虚virtual、抽象abstract、重写override方法时,说明方法具体实现已重写,就运行离具体对象类型关系最近的一个类的重写方法。当然关系最近的是自身。
最后例子说明一下:
这里提一下:抽象类无法直接实例化即不能显式调用构造器(new,反射),需要借助子类实例化时,构造函数调用抽象类的构造函数如:base()进行实例化,就是为继承和重写而生的;抽象实例成员只能放在抽象类中;静态类只能有静态成员(包括构造函数),不能显式调用构造器,初始加载时系统通过构造函数自动创建一个静态对象。
1 public abstract class A 2 { 3 public int x; 4 public A() 5 { 6 x = -1; 7 Console.WriteLine("x={0}", x); 8 Print1(); 9 Print2();10 }11 public virtual void Print1() 12 {13 x = 1;14 Console.WriteLine("x={0}", x);15 }16 17 public virtual void Print2() 18 {19 x = 2;20 Console.WriteLine("x={0}", x);21 }22 }23 24 public class B : A25 {26 public int y;27 public B()28 {29 y = -1;30 Console.WriteLine("x={0},y={1}", x, y);31 Print1();32 Print2();33 }34 35 public override void Print1()36 {37 x = 3;38 y = 1;39 Console.WriteLine("x={0},y={1}", x, y);40 }41 //该方法已覆盖,自身及其后子类重写均为这个方法42 public new virtual void Print2()43 {44 x = 4;45 y = 2;46 Console.WriteLine("x={0},y={1}", x, y);47 }48 }49 public class C : B50 {51 //该方法已覆盖,自身及其后子类继承的均为这个方法52 public new void Print1()53 {54 x = 5;55 y = 3;56 Console.WriteLine("x={0},y={1}", x, y);57 }58 //该方法重写自父类B,而不是基类A59 public override void Print2()60 {61 x = 4;62 y = 2;63 Console.WriteLine("x={0},y={1}", x, y);64 }65 }66 public static class D67 {68 public static string _name;69 static D()70 {71 _name = "小明";72 }73 }
View Code
主程序:
1 static void Main(string[] args) 2 { 3 A c = new C(); 4 c.Print1(); 5 c.Print2(); 6 //静态、抽象类反射不能创建 7 //Type type = typeof(A); 8 //var constructor = type.GetConstructor(Type.EmptyTypes); 9 //Object obj = constructor.Invoke(null);10 //Console.WriteLine(obj.GetType().Name);11 //Type type = typeof(D);12 //var constructor = type.GetConstructor(BindingFlags.Static|BindingFlags.NonPublic,null,Type.EmptyTypes,null);13 //Object obj = constructor.Invoke(null);14 //Console.WriteLine(obj.GetType().Name);15 Console.WriteLine(D._name);16 Console.ReadKey();17 }18
View Code
输出结果:
原文转载:http://www.shaoqun.com/a/512694.html
c88:https://www.ikjzd.com/w/1017
香港会计师事务所:https://www.ikjzd.com/w/2434
总结一下使用类继承和多态时,实例化顺序以及方法继承重写中new,virtual、abstract、override的用法和规则: 继承关系:实例化对象时,作用类型范围在基类到具体实例对象类之间(中间包括父类子类,成员访问权限:private、protected、public): 1、在子类构造器必须指定拥有父类访问权限的构造器:base(xxx),默认无参构造器; 2、先实例化基类,再实例化
转口贸易:转口贸易
net-a-porter:net-a-porter
深圳南澳或西冲小木屋预定电话?:深圳南澳或西冲小木屋预定电话?
深鹏发物流:深鹏发物流
峨眉山绚烂"枫"光邀您赏 :峨眉山绚烂"枫"光邀您赏
No comments:
Post a Comment