14.继承的基本规则

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)。
  • 在子类中,可以使用父类的公有方法(如 SpeakPersonSpeakAge),但无法直接调用私有方法。
  • 使用基类(父类)的行为和属性,实现了代码的复用。

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

×

喜欢就点赞,疼爱就打赏