文章目录
1、继承特点
- 单根性:子类只能有一个父类
- 传递性:子类可以间接继承父类的父类
2、继承语法
class 子类 : 父类
{
// ...
}
- 栗子
// 超类:人
class Person
{
public string Name;
public int Age;
public void Speak()
{
Console.Write("我叫{0},今年{1}岁。", Name, Age);
}
}
// 子类:老师(老师也是人,具备人的特征和行为,故直接继承超类Person,省略重复的编码)
class Teacher : Person
{
public string Subject; // 教学科目
// 上课
public void ClassBegin() {
Speak();
Console.WriteLine("我是你们的{0}老师,现在开始上课。", Subject);
}
}
// 某方法内↓↓↓
Teacher tec = new Teacher();
tec.Name = "Mr.Bai";
tec.Age = 24;
tec.Subject = "C/C++/Java/C#";
tec.ClassBegin(); // 我叫Mr.Bai,今年24岁。我是你们的C/C++/Java/C#老师,现在开始上课。
3、里氏替换原则:is / as
3.1、概念
- 任何父类出现的地方,子类都替代
- 语法表现:父类对象装载子类对象(父类声明,子类创建)
- 作用:方便对象管理和存储
// 使用2里面的栗子
Person person = new Teacher();
// 但是父类不能直接点子类的特征和行为,请继续看3.2
3.2、is
和 as
关键字
is
:判断一个对象是否是指定类型的对象- 返回
bool
- 栗子:
Console.WriteLine(tec is Person); // True
- 返回
as
:将一个对象转换为指定类对象- 返回
指定类型对象
ornull
- 栗子:
Teacher teacher = person as Teacher;
- 返回
- is 和 as 通常是配合使用的
if(person is Teacher){
// 第一种写法
Teacher t = person as Teacher;
t.ClassBegin();
// 第二种写法
(person as Teacher).ClassBegin();
}
4、继承中的构造函数:base
4.1、要点
除了 关键字 不同,其他都是各门语言相通的
- 子类可以通过
base
关键字 调用父类构造
4.2、base 关键字
- 父类有无参构造子类构造则可不写 base,否则必写,不然怎么先实例化父类呢
// 超类:人
class Person
{
public string Name;
public int Age;
// 父类构造
public Person(string name, int age){
// ...
}
}
// 子类:老师
class Teacher : Person
{
public string Subject; // 教学科目
// 子类构造
public Teacher(string name, int age, string subject) : base(name, age)
{
// ...
}
}
5、object 和 装箱拆箱
5.1、object
- 关键字:
object
,是Object
的别名- 所有类的基类
- 作用
- 可以用里氏替换原则,用 object 装所有对象
- 可以用来表示不确定的形参类型
5.2、装箱拆箱
- 装箱:用 object 存值类型
- 把值类型用引用类型存储,栈内存会迁移到堆内存
- 拆箱:把 object 转回值类型
- 把引用类型的值取出来,堆内存会迁移到栈内存
- 利弊
- 好处:不确定类型可以方便值的存储和传递
- 坏处:存在内存迁移,增加性能消耗
6、密封类:sealed
- 关键字:
secled
- 作用:修饰类,让类无法再继承(类似java的final)