C#视频—继承

什么是继承

继承:从表面意思看就是子承父业,在面向对象中即子类可以继承父类中的属性、方法等。
C#中如何继承请看下面的例子:

Public class Teacher : Person     //Teacher 继承了 Person
{
}

继承的性质

1.继承性
2.单根性:每个子类只能有一个父类,但是一个父类可以有多个子类。

子类显示调用父类有参构造函数

1.子类中的有参构造函数会默认调用父类的无参构造,如果这时父类中已经有了一个有参构造函数,那么就会报错,解决办法就是在父类中重载一个无参构造函数。
2.子类也可以使用 base 关键字,显示调用有参构造函数

public Student(string name,char gender,int age,string id):base(name,gender,age)
{            
    this._id = id;
}

里氏替换原则

1.里氏替换的用处?
 说实话,现在还不太明白里氏替换到底是干嘛用的,为什么出现。只知道有时候子类需要调用父类中的方法,所以需要先将子类变成父类。
 看到别人的理解是:子类可以扩展父类的功能,但不能改变父类原有的功能。

2.原则
1)子类可以隐式转换为父类

Person p = new Student();    //儿子可以成长为父亲
p.Say();
Console.ReadKey();

2)父类转换成子类时,必须强制转换(代码不会报错,但是运行会报异常)
这里写图片描述
3)子类转换成父类,再从父类转换成相同的子类是可以的

Person p = new Teacher();        //儿子成长为父亲,再回忆起自己的小时候
bool result = p is Teacher;
if (result)
{
    Teacher t = (Teacher)p;
    t.Say();
}
else
{
    Console.WriteLine("转换不了");
}
Console.ReadKey();

//output:
//我是人

4)子类转换成父类,但是再从父类转换成不同的子类,是不可以的

Person p = new Teacher();        //哥哥成长为父亲,可以再回忆起自己的小时候,但是却不能回忆弟弟的记忆
bool result = p is Student;
if (result)
{
    Student stu = (Student)p;
    stu.Say();
}
else
{
    Console.WriteLine("转换不了");
}
Console.ReadKey();

//output:
//转换不了

★如何分辨子类转父类,还是父类转子类?
 一开始对于子类转父类、父类转子类,我也是“棒棒”分不清楚。我的理解是这样的:=是赋值运算符,把右边的赋值给左边的,就是右转左。=左边是谁,就是转向谁。

★总结
 里氏转换类似于数据类型之间的显、隐式转换,即小范围的可以直接转换成大范围的,但是如果大范围的转换成小范围的就要强制转换。
 里氏替换也是一样:子类可以变父类、子类可以变成父类再变回子类;但是不能直接从父类变成子类,也不能变成另外的子类。

里氏替换中 is 和 as 的用法

1. is 是用来判断是否可以从父类转换成子类的,返回一个 bool 值,成功返回 true,不成功返回 false
2. as 不判断,直接转换。如果不能转换成功,就会返回空值。如果不符合转换规则,在转换的时候不会报异常,在调用方法的时候才会报异常。如果不用 as 进行转换,那么在转换的时候就会报异常。
 具体请看下图与上图的对比:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zwj_jyzl/article/details/80551663