----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
面向对象的三大基本特征: 封装 继承 多态。
一.继承
1.继承的概念
(1)如果A类具有B类所有的特性,那么就说A类继承了B类。在C#中A类也叫做父类或者基类,B类就叫做子类或者是派生类。判断一个继承的合理性:子类is a 父类。
(2)继承是类与类之间的一种关系,例如:我的这台华硕电脑(对象)继承自华硕电脑(类),这种说法是不正确。
注意:记住继承里面的一些专业术语,对以后看文档很有帮助:父类(Parent Class) 和子类(Child Class)
基类(Base Class)和派生类(Derived Class)
(3) 继承的特性:类的单根继承性和传递性
类的单根继承性:通俗一点说就是一个类只能同时继承自一个父类。
传递性:子类A继承了父类B 然后B类又继承了C类 传递性体现在A类不仅继承了B类的所有特性,而且还继承了C类的所有特性。
下面举例来说明继承:
public class Person//父类
{
private string name;
public string Name//Name属性
{
get;
set;
}
public int Age//Age属性
{
get;
set;
}
}
public class Student : Person//子类
{
public int Score//特有的成绩属性
{
get;
set;
}
public void Learn()//特有的方法
{
Console.WriteLine("学习 学习 还是学习");
}
}
写完这两个类后,再到控制台Main()方法中new一个student类对象和一个Person类对象
查看一下效果:
通过上面这张截图大家可以发现,当用对象st去调用自己类成员时,发现成员列表中不仅有自己类中的成员Score属性和Learn方法,而且还有父类中的Age,Gender,Name三个属性。所以说在继承关系中:子类继承了基类的所有方法和属性,只是用private修饰的属性和方法无法访问到而已(其中Person类中的name字段是访问不到的)。
另外不知道大家发现没有下面的这张截图中,当用Person类对象ps去调用自己的类成员时,为什么成员列表里面除了有自己类中定义的Age,Gender,Name三个属性之外,还有Equals,GetHashCode,GetType,Tostring四个方法(Person类也没有显示继承什么类啊)?这四个方法是从哪里来的呢?
其实原理很简单:
(1)C#中所有的类都直接或间接的继承了Object类。(祖先类)
(2) 如果一个类没有显示继承自任何类,则默认情况下是继承自Object类,就像本例中的Person类,所以当用类对象ps调用自己的成员时,列表中不仅有自己类中的成员,还有object类中的四个方法。
(3)如果一个类显示的继承自某个类,则将覆盖默认继承的Object类(要符合的继承单根性)这个就像本例中的Student类。至于Student类对象st的成员列表中为什么也会有那四个方法,是因为继承的传递性。
2.继承中对象的隐式转换和显式转换
(1) 可以用父类变量指向子类对象
例如:上例中 Person是父类,Student是子类;父类变量可以指向子类变量
Student ps= new Student();
Person per=ps;
上述过程可以理解为;就是给实在的东西贴标签的过程,此处是把人的标签贴在学生的实例上。它等价于 Person per=new Student();
(2) 也可以把子类变量指向这个父类变量的时候需要做类型转换
例如: Person per=new Student(); //人的标签贴在学生的实例上
Student lsPerson=(Student)per;//程序执行时,不会往上面看,所以需要注明per这个实例是属于Student类的
3. 继承中构造函数要点
(1)继承时,构造函数是不能被继承的。
(2)子类的构造函数会默认地去调用父类的无参构造函数,所以如果父类中是一个有参数的构造函数(这样父类就没有无参构造函数),那么当调用子类构造函数时就会报错。
(3)利用父类的构造函数给子类赋值(通过base关键字来实现)
举例:
public class Person//父类
{
public Person(string name, int age)//有参数构造函数
{
this.Name = name;
this.Age = age;
}
public string Name//Name属性
{
get;
set;
}
public int Age//Age属性
{
get;
set;
}
}
public class Student : Person//子类
{
//除了继承Person类中的所有特性,还有自己特有的特性
public Student(string name, int age, int score)//构造函数
:base(name,age)
{
//this.Name = name;
//this.Age = age; 注释掉了不用写
this.Score = score;
}
public int Score//特有的成绩属性
{
get;
set;
}
public void Learn()//特有的方法
{
Console.WriteLine("学习 学习 还是学习");
}
}控制台的结果:
4. 继承中 Base 和this 关键字的作用比较
Base关键字:(1)像上例中那样,通过使用Base关键字子类能够调用父类构造函数来初始化对象
(2)能够用Base关键字来调用父类成员 base.Name
This关键字: (1)通过使用This关键字当前类能够调用自己当前类中的构造函数。
(2)能够用This关键字来调用类成员 this.Name