14.面向对象-继承-继承的基本规则
14.1 知识点
继承的基本概念
- 一个类A继承一个类B
- 类A将会继承类B的所有成员
- A类将拥有B类的所有特征和行为
- 被继承的类称为父类、基类、超类
- 继承的类称为子类、派生类
- 子类可以有自己的特征和行为
继承的特点
- 单根性:子类只能有一个父类
- 传递性:子类可以间接继承父类的父类
继承的基本语法
class 类名 : 被继承的类名
{
// ...
}
继承的实例
class语句块外 namespace语句块内
// 老师类
class Teacher
{
//姓名
public string name;
//介绍名字
public void SpeakName()
{
number = 10;
Console.WriteLine("我是老师" + name);
}
}
// 教学老师类 继承 老师类
class TeachingTeacher : Teacher
{
//科目
public string subject;
//介绍科目
public void SpeakSubject()
{
number = 11;
Console.WriteLine("我是" + subject + "学科的老师");
}
}
//语文老师类 继承 教学老师类
class ChineseTeacher : TeachingTeacher
{
public void Skill()
{
Console.WriteLine("天若有情天亦老,人间正道是沧桑!");
}
}
//警察类
class Police
{
}
主函数内
TeachingTeacher teacher1 = new TeachingTeacher();
//可以使用父类的成员
teacher1.name = "林文韬";
teacher1.SpeakName();//我是老师林文韬
teacher1.subject = "Unity";
teacher1.SpeakSubject();//我是Unity学科的老师
ChineseTeacher chineseTeacher1 = new ChineseTeacher();
//可以使用父类 爷爷类的成员
chineseTeacher1.name = "莫言";
chineseTeacher1.subject = "语文";
chineseTeacher1.SpeakName();//我是老师莫言
chineseTeacher1.SpeakSubject();//我是语文学科的老师
chineseTeacher1.Skill();//天若有情天亦老,人间正道是沧桑!
访问修饰符的影响
public
- 公共 内外部访问private
- 私有 内部访问protected
- 保护 内部和子类访问internal
- 内部的 只有在同一个程序集的文件中,内部类型或者是成员才可以访问
老师类内
//职工号
protected int number;
主函数内
TeachingTeacher teacher2 = new TeachingTeacher();
teacher2.name = "蔡徐坤";
//teacher2.number = 1;
//报错 number是protected的 不可以在外部访问 只能在内部和子类访问
teacher2.SpeakName();//我是老师蔡徐坤
teacher2.subject = "唱跳rap篮球";
teacher2.SpeakSubject();//我是唱跳rap篮球学科的老师
子类和父类的同名成员
- C#中允许子类存在和父类同名的成员
- 但是 极不建议使用
教学老师类内
//重新声明的姓名 会把父类中的name给覆盖掉 非常不建议这样子使用
//public new string name;
总结
- 继承的基本语法:
class 类名 : 父类名
- 继承的特点
- 单根性:只能继承一个父类
- 传递性:子类可以继承父类的父类。。。的所有内容
- 访问修饰符 对于成员的影响
- 极不建议使用 在子类中申明和父类同名的成员(以后学习了多态再来解决这个问题)
14.2 知识点代码
using System;
namespace Lesson12_继承_继承的基本规则
{
#region 知识点一 继承的基本概念
//一个类A继承一个类B
//类A将会继承类B的所有成员
//A类将拥有B类的所有特征和行为
//被继承的类称为 父类、基类、超类
//继承的类称为子类、派生类
//子类可以有自己的特征和行为
//继承的特点
//1.单根性 子类只能有一个父类
//2.传递性 子类可以间接继承父类的父类
#endregion
#region 知识点二 继承的基本语法
//class 类名 : 被继承的类名
//{
//}
#endregion
//class语句块外 namespace语句块内
#region 知识点三 继承的实例
// 老师类
class Teacher
{
//姓名
public string name;
#region 知识点四 访问修饰符的影响
//老师类内
//职工号
protected int number;
#endregion
//介绍名字
public void SpeakName()
{
number = 10;
Console.WriteLine("我是老师" + name);
}
}
// 教学老师类 继承 老师类
class TeachingTeacher : Teacher
//class TeachingTeacher : Teacher,Police//报错 不能具有多个基类
{
//科目
public string subject;
#region 知识点五 子类和父类的同名成员
//教学老师类内
//重新声明的姓名 会把父类中的name给覆盖掉 非常不建议这样子使用
//public new string name;
#endregion
//介绍科目
public void SpeakSubject()
{
number = 11;
Console.WriteLine("我是" + subject + "学科的老师");
}
}
//语文老师类 继承 教学老师类
class ChineseTeacher :TeachingTeacher
{
public void Skill()
{
Console.WriteLine("天若有情天亦老,人间正道是沧桑!");
}
}
//警察类
class Police
{
}
#endregion
#region 知识点四 访问修饰符的影响
//public - 公共 内外部访问
//private - 私有 内部访问
//protected - 保护 内部和子类访问
//internal - 内部的 只有在同一个程序集的文件中,内部类型或者是成员才可以访问 之后讲命名空间的时候讲
#endregion
#region 知识点五 子类和父类的同名成员
//概念
//C#中允许子类存在和父类同名的成员
//但是 极不建议使用
#endregion
class Program
{
static void Main(string[] args)
{
Console.WriteLine("继承的基本规则");
//主函数内
#region 知识点三 继承的实例
TeachingTeacher teacher1 = new TeachingTeacher();
//可以使用 父类 的成员
teacher1.name = "林文韬";
teacher1.SpeakName();//我是老师林文韬
teacher1.subject = "Unity";
teacher1.SpeakSubject();//我是Unity学科的老师
ChineseTeacher chineseTeacher1 = new ChineseTeacher();
//可以使用 父类 爷爷类的成员
chineseTeacher1.name = "莫言";
chineseTeacher1.subject = "语文";
chineseTeacher1.SpeakName();//我是老师莫言
chineseTeacher1.SpeakSubject();//我是语文学科的老师
chineseTeacher1.Skill();//天若有情天亦老,人间正道是沧桑!
#endregion
#region 知识点四 访问修饰符的影响
TeachingTeacher teacher2 = new TeachingTeacher();
teacher2.name = "蔡徐坤";
//teacher2.number = 1;
//报错 number是protected的 不可以在外部访问 只能在内部和子类访问
teacher2.SpeakName();//我是老师蔡徐坤
teacher2.subject = "唱跳rap篮球";
teacher2.SpeakSubject();//我是唱跳rap篮球学科的老师
#endregion
}
}
//总结
// 继承的基本语法:class 类名:父类名
// 继承的特点
// 1.单根性:只能继承一个父类
// 2.传递性:子类可以继承父类的父类。。。的所有内容
// 3.访问修饰符 对于成员的影响
// 4.极奇不建议使用 在子类中申明和父类同名的成员(以后学习了多态再来解决这个问题)
}
14.3 练习题
写一个人类,人类中有姓名,年龄属性,有说话行为,战士类继承人类,有攻击行为
class语句块外 namespace语句块内
// 人 类
class Person
{
//姓名
public string Name
{
get;
set;
}
//年龄属性
private int Age
{
get;
set;
}
//说话行为
public void Speak(string str)
{
Console.WriteLine(str);
}
//说话年龄行为
public void PersonSpeakAge()
{
Age = 10;
Console.WriteLine("我的年龄是" + Age);
}
}
// 战士 类 继承 人 类
class Warrior : Person
{
//攻击行为
public void Atk(Warrior otherWarrior)
{
Console.WriteLine("{0}打了{1}", Name, otherWarrior.Name);
}
//说话年龄行为
//public void WarriorSpeakAge()
//{
// //子类和外部 不能直接使用父类的私有的成员
// //Age = 10;//报错 父类的“Person.Age”不可访问,因为它是private的
// //Console.WriteLine("我的年龄是" + Age);//报错
//}
}
主函数内
// 主函数内
Warrior w1 = new Warrior();
w1.Name = "奥拉夫";
Warrior w2 = new Warrior();
w2.Name = "奥特曼";
w1.Atk(w2);//奥拉夫打了奥特曼
w1.Speak("我是奥特曼");//我是奥特曼
w1.PersonSpeakAge();//我的年龄是10
注:
- 子类(战士类)可以直接访问父类(人类)的公有成员(如
Name
),但不能直接访问私有成员(如Age
)。 - 在子类中,可以使用父类的公有方法(如
Speak
和PersonSpeakAge
),但无法直接调用私有方法。 - 使用基类(父类)的行为和属性,实现了代码的复用。
14.4 练习题代码
using System;
namespace Lesson12_练习题
{
#region 练习题一
//写一个人类,人类中有姓名,年龄属性,有说话行为
//战士类继承人类,有攻击行为
//class语句块外 namespace语句块内
// 人 类
class Person
{
//姓名
public string Name
{
get;
set;
}
//年龄属性
private int Age
{
get;
set;
}
//说话行为
public void Speak(string str)
{
Console.WriteLine(str);
}
//说话年龄行为
public void PersonSpeakAge()
{
Age = 10;
Console.WriteLine("我的年龄是" + Age);
}
}
// 战士 类 继承 人 类
class Warrior : Person
{
//攻击行为
public void Atk( Warrior otherWarrior )
{
Console.WriteLine("{0}打了{1}", Name, otherWarrior.Name);
}
//说话年龄行为
//public void WarriorSpeakAge()
//{
// //子类和外部 不能直接使用父类的私有的成员
// //Age = 10;//报错 父类的“Person.Age”不可访问,因为它是private的
// //Console.WriteLine("我的年龄是" + Age);//报错
//}
}
#endregion
class Program
{
static void Main(string[] args)
{
Console.WriteLine("继承练习题");
//主函数内
#region 练习题一
Warrior w1 = new Warrior();
w1.Name = "奥拉夫";
Warrior w2 = new Warrior();
w2.Name = "奥特曼";
w1.Atk(w2);//奥拉夫打了奥特曼
w1.Speak("我是奥特曼");//我是奥特曼
w1.PersonSpeakAge();//我的年龄是10
#endregion
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com