今天我们来聊一聊继承,说实话今天也是我第一次接触。
继承的概念是什么呢?就是一个类可以继承另一个类的属性和方法(成员)
继承是面向对象编程中的一个非常重要的特性。
好了,废话不多说,下面切入正题:
1.首先我们定义一个子类,给它创建两个构造:一个无参构造和一个有参构造
? 定义一个枚举类
在定义的子类中它有自己独有的属性:
?
在定义的父类中的属性和构造:
?
在Main方法中:
同时要注意,在调用子类的带参构造时,我们要想到调用子类构造的时候,没有使用base关键字调用父类的指定的构造,默认调用父类的无参构造.
补充一下:
?? 01.base代表父类对象,如果base():调用父类的构造函数
???02.base代表的是方法调用,是不需要参数类型的
??03.base(传参顺序和父类构造一致,变量名和子类构造参数一致)
2.在这里补充一点访问修饰符
我们所知道的:public? private? protected
下面我画一个图来简单的描述一下(√表示可以,×表示不可以)
??????????????? ? 当前类???? 子类???? 其他类(Program)
?? private???????? √????????? ×??????? ×
?? protected???? √????????? √??????? ×
?? public?????????? √????????? √??????? √
总结:我们可以清晰的明白三种访问修饰符对类成员的访问限制强度:private>protected>public
?3.new 子类底层原理图
我简单的用一个图来描述一下:
用文字描述:
?? 1.走到子类构造,不进入构造体
?? 2.转向父类,进入父类构造体执行
?? 3.转回子类构造,执行子类构造体
?? 4.转到Main,内存中构建出子类对象
4.继承还具有两大特性这个我们也不要忘记了,就是单根性和传递性
? 单根性指的就是一个子类只有一个父类
? 传递性就是只要跟父类有继承关系,就可以使用父类的属性和方法
接下来我们讲一讲多态
1.多态是什么呢?字面上的意思就是多种形态
用专业一点的话来说就是指同一个操作作用于不同的对象时,可以有不同的解释,产生不同的执行效果。
我们所接触的方法重载也是多态的一种方式。
如何实现多态呢?不要急下面我来解说
(1)实现方法的重写
????? 在父类中定义的方法,用virtual关键字来定义为虚方法
???? 在子类中定义自己的方法,用override关键字来修饰,实现对父类的方法的重写
(2)定义父类变量,用子类变量初始化父类变量
是不是觉得抽象,其实我刚开始学习时也是一样的,下面来一个小案例:
//创建一个Person父类
?public class Person
??? {
?????? public?virtual?void SayHello()
?????? {
??????????? //父类特有的方法
?????????? Console.WriteLine("父类打招呼方法");
?????? }
??? }
//创建一个Korea子类
public class Korea:Person? //在这里要注意它继承于Person类
??? {
?????? public?override?void SayHello()
?????? {
?????????? Console.WriteLine("金喜善打招呼方法");
?????? }
??? }
//创建一个Chinese类
public class Chinese:Person?//在这里要注意它继承于Person类
??? {
?????? public override void SayHello()
?????? {
?????????? Console.WriteLine("你好!");
?????? }
??? }
//创建一个American类
public class American:Person???//在这里要注意它继承于Person类
??? {
??????? public?override?void SayHello()
??????? {
??????????? Console.WriteLine("Hello");
??????? }
??? }
?前面我们也学过泛型了下面我们就用泛型来存储
??????????? List<Person> list=new List<Person>();
??????????? Chinese chinese=new Chinese();
??????????? American usa=new American();
??????????? Korea korea=new Korea();
??????????? list.Add(chinese);
??????????? list.Add(usa);
??????????? list.Add(korea);
下面我们可以用foreach来遍历
方式一:
?????????? foreach (Person person in list)
??????????? {
?????????????? person.SayHello();
??????????? }
方式二:
?????????? foreach (Person person in list)
??????????? {
?????????????? //方式二:不使用统一调用
??????????????? if (person is Chinese)
??????????????? {
?????????????????? Chinese chinese= person as Chinese;
??????????????????? chinese.SayHello();
??????????????? }
?????????????? if (person is Korea)
??????????????? {
????????????????????Korea chinese= person as??Korea;
????????????????????korea.SayHello();
??????????????? }
?????????????? if (person is??American)
??????????????? {
????????????????????American chinese= person as??American;
?????????????????????american.SayHello();
??????????????? }
??????????? }
下面我再穿插个示例: