继承
(1)继承的基本概念
一个类A继承一个类B代表:
类A将继承类B的所有成员,A类将拥有B类的所有特征与行为。
被继承的类称为父类,基类。
继承的类被称为子类,派生类
子类可以有自己的特征和行为
特点:
1.单根性 子类只能有一个父类
2.传递性 子类可以间接继承父类的父类
(2)基本语法
(3)实例
class Teacher
{
public string name;
public int numbe
public void SpeakName()
{
Console.WriteLine(name);
}
}
class TeachingTeacher:Teacher
{
public string subject;
public void SpeakSubject()
{
Console.WriteLine(subject+"老师");
}
}
class ChineseTeacher:TeachingTeacher
{
public void Skill()
{
Console.WriteLine("念诗");
}
}
***********************************************************
//使用1
TeachingTeacher tt=new TeachingTeacher();
tt.name="唐老师";
tt.number=1;
tt.SpeakName();//从父类继承过来的成员变量和方法
tt.subject="Unity";//自己的成员变量和方法
tt.SpeakSubject();
**************************************************************
//使用2:子类的子类
ChineseTeacher ct=new ChineseTeacher();
ct.name="唐老师";
ct.number=2;
ct.subject="语文";
ct.SpeakName();
ct.SpeakSubject();
ct.skill();
****************************************************************
(4)访问修饰符的影响
//保护类型都是在继承的时候起作用
//如果一个成员变量,我们希望外部不访问它,但是希望它的子类可以访问它则使用protect类型。
(5)子类与父类的同名成员
//C#支持这么写,但是极其不推荐这么写。
********************************************************************
总结:
***********************************************************************
里氏替换原则
(1)基本概念
(2)基本实现
Class GameObject
{
}
class Player:GameObject
{
public void PlayerAtk()
{
Console.WriteLine("玩家攻击");
}
}
class Monster:GameObject
{
public void MonsterAtk()
{
Console.WriteLine("怪物攻击");
}
}
class Boss:GameObject
{
public void BossAtk()
{
Console.WriteLine("Boss攻击");
}
}
***********************************************
实现:
//里氏替换原则体现:用父类容器装载子类对象
GameObject player =new Player();
GameObject monster =new Monster();
GameObject boss=new Boss();
GameObject[] objects=new GameObject[]{new Player(),new Monster,new Boss()};
//根据里氏替换原则,这样写都不会报错
*******************************************************************
//但是会出现一系列问题:
比如: player. 你会发现 . 不出内容,因为player是GameObject类型如何解决这一现象?
即:如何通过父类容器去实现子类独特的方法?
(3)is和as
*******************************************************
is:判断一个对象是否是指定类对象
返回值:bool 是为真,不是为假
用法:
if(player is Player)//判断变量player的类类型是不是Player类,如果是的话才进入括号内,如果不是则不进入
{
}
********************************************************
as:将一个对象转换成指定类对象
返回值:指定类型对象
成功返回指定类型对象,失败返回null、
用法:
Player p=player as Player;//这样就会返回一个为Player类型的变量,因为player本身作为GameObject类型的变量装载的就是Player类型的值,所以转成Player类型是合理的
如果写成:Player p= monster as Player;则转换失败,因为monster装载的是Monster的类型
返回失败就会返回null,
for(int i=0;i<objects.Length;i++)
{
if(objects[i] is Player)//虽然数组中的每个元素都是GameObject类型但是它装载的类型不同,is是判断其装载的类型。(重要,注意理解)
{
}
else if(objects[i] is Monster)
{
}
else if(objects[i] is Boss)
{
}
}
********************************************************
总结:
*************************************************************
继承中的构造函数
(1)知识回顾
知识回顾(代码):
public Test (int i,string str):this(i)//这个this的意思是先执行只有一个参数的构造函数(上面那个Test(int i))
{
this.testStr=str;
}
(1)继承中的构造函数 基本概念
特点:当声明一个子类对象时,先执行父类的构造函数,再执行子类的构造函数
注意:父类的构造函数很重要,子类可以通过base关键字代表父类,调用父类的构造
(2)继承中构造函数的执行顺序
父类的父类构造->。。。。父类构造->。。。。。子类的构造
结构:
(3)父类的无参构造很重要