继 承 是 为 了 解 决 代 码 重 复 问 题 的 , 比 如 下 面 有 两 个 类 继承是为了解决代码重复问题的,比如下面有两个类 继承是为了解决代码重复问题的,比如下面有两个类
class Dog
{
public string Name { get; set; }
public void Shout() { Console.WriteLine(this.Name + ":汪汪"); }
}
class Cat
{
public string Name { get; set; }
public void Shout() { Console.WriteLine(this.Name + ":喵喵"); }
}
可 以 看 到 C a t 类 和 D o g 类 几 乎 一 致 , 但 是 我 们 还 是 得 完 整 的 写 下 来 可以看到Cat类和Dog类几乎一致,但是我们还是得完整的写下来 可以看到Cat类和Dog类几乎一致,但是我们还是得完整的写下来
继承可以很好的解决这个问题,相同的部分继承过来就好了嘛!
class Animal
{
public string Name { get; set; }
}
class Dog:Animal
{
public void Shout() { Console.WriteLine(this.Name + ":汪汪"); }
}
class Cat:Animal
{
public void Shout() { Console.WriteLine(this.Name + ":喵喵"); }
}
可 以 看 到 在 D o g 和 C a t 后 面 加 上 : A n i m a l 表 示 继 承 可以看到在Dog和Cat后面加上:Animal表示继承 可以看到在Dog和Cat后面加上:Animal表示继承
此 时 , A n i m a l 叫 做 父 类 / 基 类 / 超 类 此时,Animal叫做\color{Red}父类/基类/超类 此时,Animal叫做父类/基类/超类
C
a
t
和
D
o
g
叫
做
派
生
类
/
子
类
Cat和Dog叫做\color{Red}派生类/子类
Cat和Dog叫做派生类/子类
要 点 一 、 C # 只 允 许 单 一 继 承 \color{Red}要点一、C\#只允许单一继承 要点一、C#只允许单一继承
什 么 意 思 ? 意 思 是 D o g 后 面 只 能 继 承 一 个 父 类 什么意思?意思是Dog后面只能继承一个父类 什么意思?意思是Dog后面只能继承一个父类
比 如 现 在 D o g 后 面 继 承 的 是 A n i m a l , 那 就 不 能 再 接 其 他 的 了 比如现在Dog后面继承的是Animal,那就不能再接其他的了 比如现在Dog后面继承的是Animal,那就不能再接其他的了
要 实 现 多 继 承 , 需 要 使 用 接 口 这 个 概 念 . . . 下 一 篇 写 要实现多继承,需要使用接口这个概念...下一篇写 要实现多继承,需要使用接口这个概念...下一篇写
问 题 一 、 想 从 父 类 继 承 私 有 属 性 , 怎 么 办 ? \color{Red}问题一、想从父类继承私有属性,怎么办? 问题一、想从父类继承私有属性,怎么办?
假 如 直 接 往 A n i m a l 里 面 写 个 p r i v a t e , 假如直接往Animal里面写个private, 假如直接往Animal里面写个private,
那 么 只 能 在 A n i m a l 这 个 类 里 面 访 问 , 根 本 达 不 到 继 承 的 目 的 呀 ! ! 那么只能在Animal这个类里面访问,根本达不到继承的目的呀!! 那么只能在Animal这个类里面访问,根本达不到继承的目的呀!!
protected关键字出现了,可以保证继承而不被外部访问
class Animal
{
protected int beautiful { get; set; }//多添加的属性
public string Name { get; set; }
}
class Dog:Animal
{
public Dog() { this.beautiful = 2; }//构造方法,初始化beautiful
public void Shout() { Console.WriteLine(this.Name + ":汪汪,美丽值是"+this.beautiful); }
}
问 题 二 、 类 型 转 换 \color{Red}问题二、类型转换 问题二、类型转换
在 m a i n 函 数 中 创 建 上 面 的 类 , 正 常 写 法 在main函数中创建上面的类,正常写法 在main函数中创建上面的类,正常写法
Dog now = new Dog() {Name = "小黑"};
Console.WriteLine(now.Name);
使 用 类 型 转 换 使用类型转换 使用类型转换
Animal now = new Dog() { Name = "小黑" };
Console.WriteLine(now.Name);
上 面 的 实 质 是 把 D o g 转 化 成 了 A n i m a l 对 象 上面的实质是把Dog转化成了Animal对象 上面的实质是把Dog转化成了Animal对象
所 以 D o g 独 有 的 s h o u t 方 法 没 了 , 但 N a m e 仍 然 可 以 访 问 所以Dog独有的shout方法没了,但Name仍然可以访问 所以Dog独有的shout方法没了,但Name仍然可以访问
这么转换类型有什么好处?详见下一讲<多态>