黑马程序员-面向对象复习2

来源:互联网 发布:抓娃娃机h5源码下载 编辑:程序博客网 时间:2024/05/22 09:37

------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------

继承:

继承描述现实世界中相互包括的对象之间的关系,如人类包括中国人和美国人,中国人包括东北人和南方人,灵长类包括人和大猩猩,哺乳动物包括灵长类和其他来,这种关系的抽象叫做继承关系。

C#中只允许单继承,但允许继承多个接口,下面是一个继承的实例:

Class Person{

int age;

string name;

public void talk(){

console.writeline("大家好我的名字叫做"+this.name);

}

}

Class student : Person{

// 暂时为空

}

虽然student目前是空白,但它已经从Person类继承了一个方法和两个字段如果这两个字段是公共的,我们可以调用子类的talk方法来输出学生的姓名。

从底层的角度看,继承的实现是一个拼接的过程,子类新添加的字段和方法被放在父类的后面,而this指针总是指向父类的第一个元素(也可能不是,但位置一般固定),继承之后,原来父类的字段可以“看成”是子类的字段,各字段的访问是隐含的this指针加上偏移量来完成了。

而类中的方法,无论静态还是动态,一般和类的字段分开存放,不计入类的总大小之内。

子类可以添加新方法和字段:

Class student : Person{

string school number;

public void gotoschool(){

...

}

}

也可以覆盖基类的方法,但要注意,覆盖时,父类的方法必须是虚方法,子类的方法必须加上override关键字:

Class Person{

int age;

string name;

public virtual void talk(){

console.writeline("大家好我的名字叫做"+this.name);

}

}

Class student : Person{

public override void talk(){

console.writeline("老师您好,我的名字叫做"+this.name);

}

}

方法的覆盖和多态的实现有密切关系,稍后介绍,下面要复习的是构造方法

构造方法是一种特殊的方法,它没有返回值而且和类名相同,类的实例通过构造函数进行类的初始化,一个类必须有构造函数,即使不显式的写出,编译器也会自动调用一个没有参数和具体实现的构造函数,如果写出显式的构造函数,那么系统默认的无参构造函数就不会被执行,构造函数可以被重载:

Class Person{

int age;

string name;

Person(){

}

Person(int age,string name){

this.name=name;

this.age=age;

}

public virtual void talk(){

console.writeline("大家好我的名字叫做"+this.name);

}

}

构造方法不需要被显式的继承,但有一点要注意,子类在调用自己的构造方法之前,会隐式的调用父类的无参构造方法(因为只有父类被构造完才能构造子类),如果父类中给出了有参数构造方法而没有给出无参构造(这时原始的无参构造被隐藏),编译器会报出一个缺少“0参数构造方法的错误”:

Class Person{

int age;

string name;

Person(int age,string name){

this.name=name;

this.age=age;

}

//没有无参数的构造方法

public virtual void talk(){

console.writeline("大家好我的名字叫做"+this.name);

}

}


Class student : Person{

student(){

...

}

public override void talk(){


console.writeline("老师您好,我的名字叫做"+this.name);

}

}

这时编译器会报错,正确的做法是在子类构造方法后加上base来调用父类的有参构造方法:

Class Person{

int age;

string name;

Person(int age,string name){

this.name=name;

this.age=age;

}

public virtual void talk(){

console.writeline("大家好我的名字叫做"+this.name);

}

}


Class student : Person{

student()base(0,null) {

...

}


public override void talk(){

console.writeline("老师您好,我的名字叫做"+this.name);

}

}

base类似于java中的super方法,用于从子类中调用父类的方法和使用父类的字段,调用构造函数用base(),一般方法用base.方法名 ()



------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------

原创粉丝点击