1.实例化父类时,可以通过new子类来实例化父类,执行构造函数的顺序为:先执行父类的构造函数,再执行子类的构造函数。
2.实例化子类时,只可以new子类,执行顺序同上。
3.父类实例化后,只能执行父类的方法,获得父类的属性等。
4.实例化子类,可同时执行子类和父类的方法和属性,如同名方法,则执行子类的方法。
public class A { public A(string a) { } } public class B:A { public B() { } }
这段代码会有一个错误提示:
Severity Code Description Project File Line Suppression State Error CS7036 There is no argument given that corresponds to the required formal parameter 'a' of 'Program.A.A(string)' practise1 c:\users\xuric\documents\visual studio 2015\Projects\practise1\practise1\Program.cs 21 Active
给A类添加无参数的构造函数即可解决。
那么为什么会这样呢,我们知道,子类在创建对象执行构造函数之前会先执行父类的构造函数,那么假如父类中有多个构造函数,又是执行哪个呢,这时候base这个关键字我想可以来说明一切。还是看代码吧:
public class A { public A() { } public A(string a) { } } public class B:A { public B():base() { } }
在A中添加了无参构造函数,然后在B中修改了这句:pubic B():base(){},然后我们测试下,创建一个B对象,在A类中的2个构造函数中设置断点,发现无参构造函数执行了,我想正是因为这个base在这里发挥了作用,是base()指向了父类的无参构造函数。其实,在类B中,我们完全可以省略 base(),也能正常运行,
第一段代码中提示的错误的原因是A类中没有无参的构造函数,这样在执行B中的构造函数的时候,就没法执行A中的无参构造函数了。 下面我在写一段不使用无参构造函数的代码,看了会更加清晰:
public class A { public A(string a) { // } } public class B:A { public B(string a):base(a) { // } }
B中的构造函数指定了调用父类的A(string a)构造函数。这样我们创建B对象在执行B的构造函数前就会先执行父类中对应的指定的构造函数了。