C#类的继承、里氏替换原则、继承类的构造函数、子类访问父类、访问修饰符

ModelEngine·创作计划征文活动 10w+人浏览 1.7k人参与

•类的继承:

继承:根据 现有的类,生成一个新的类

当创建 一个类 的时候,可以 不需要 重新编写 成员方法和成员变量,而是 继承 现有的类

这个被 继承的类 我们称之为 “父类”(基类),这个 新的类 我们称之为"子类"(派生类)

如果一个类 没有 继承任何类,那么他 默认继承的 就是object类,c#中所有的类,都 直接 或者 间接 继承object,object是 所有类的“终极基类"

internal class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student()
            {
                name = "Test",
                age = 18,
                studentId = "888888",
                school = "传鼎"
            };
            student.eat();
            student.study();
            Student1 student1 = new Student1()
            {
                name = "abc",
                sex = 'a'
            };
            student1.study();
        }
    }
    // 基类  父类
    class People
    {
        public string name { get; set; }
        public int age { get; set; }
        public char sex { get; set; }
        public void eat()
        { Console.WriteLine("吃饭"); }
    }
    // 派生类  子类
    // 在定义一个类的时候 使用 ":" 基类  实现继承
    // 格式:  class 子类名 : 父类名
    // 当一个 类 继承 另一个类 的时候,子类 将自动拥有 父类的成员(成员变量和成员方法)
    class Student : People
    {
        public string studentId { get; set; }
        public string school { get; set; }
        public void study()
        { Console.WriteLine($"我是{name},在{school}学习"); }
    }
    //基类 和 派生类 并不是一个绝对的概念,是相对的,一个类可以是 基类 也可以是 派生类
    //一个父类 可以有 多个子类,一个类 可以同时是 子类 也是 父类
    class Student1 : People
    {
        public void study()
        { Console.WriteLine("这是Student1 的study方法"); }
    }
}
•里氏替换原则:

概念: 任何父类出现的地方,子类都可以替代

重点: 语法表现 父类容器装子类对象 ,因为子类对象包含了父类的所有内容,不能用子类容器装父类对象

作用: 方便进行对象存储和管理

namespace 里氏替换原则
{
    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攻击"); }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            //里氏替换原则 用父类容器 装载子类对象
            GameObject player = new Player();
            GameObject monster = new Monster();
            GameObject boss = new Boss();
            GameObject[] objects = new GameObject[] { new Player(), new Monster(), new Boss() };
            // is和as
​
            //基本概念
            // is:判断一个对象是否是指定类对象
            //返回值:boo1 是为真 不是为假      
​
            // as:将一个对象转换为指定类对象
            //返回值:指定类型对象
            //成功返回指定类型对象,失败返回nu11
​
            //基本语法
            // 类对象 is 类名  该语句块 会有一个bool返回值 true和false
            // 类对象 as 类名  该语句块 会有一个对象返回值 对象和null 
            if (player is Player)
            {
                //Player p = player as Player;
                //p.PlayerAtk();
                (player as Player).PlayerAtk();
            }
            for (int i = 0; i < objects.Length; i++)
            {
                if (objects[i] is Player)
                { (objects[i] as Player).PlayerAtk(); }
                else if (objects[i] is Monster)
                { (objects[i] as Monster).MonsterAtk(); }
                else if (objects[i] is Boss)
                { (objects[i] as Boss).BossAtk(); }
            }
        }
    }
}
•继承类的构造函数:

特点: 当申明一个子类对象时 先执行父类的构造函数 再执行子类的构造函数

注意: 1.父类的无参构造 很重要 2.子类可以通过base关键字 代表父类 调用父类构造

internal class Program
{
    static void Main(string[] args)
    {
        Student student = new Student();
        Console.WriteLine(student.id);
        Console.WriteLine(student.sex);
        Console.WriteLine(student.name);//郝
        student.Test();
        Console.WriteLine(student.name);//瑞
        People people = new People();
        Console.WriteLine(people.name);//郝
    }
}
class People
{
    public string name { get; set; }
    public char sex { get; set; }
    public readonly int id;
    public People()
    {
        Console.WriteLine("父类的构造函数");
        id = 12345;
        name = "郝文涌";
    }
}
class Student : People
{
    //当 new 一个类的时候,这个 子类 创建之前 父类就应该先存在了,因此会 先执行父类的 构造函数,然后再 执行子类的 构造函数
    public Student(string name)
    { name = "马"; }
    public Student()
    {
        Console.WriteLine("子类的构造函数");
        sex = '男';
    }
    public void Test()       
    {
        //子类可以直接操作定义在父类的属性和字段
        name = "瑞瑞";
    }
}
•子类访问父类:
internal class Program
{
    static void Main(string[] args)
    {
        Student student1 = new Student();
        Console.WriteLine(student1.Name);
        Console.WriteLine(student1.Sex);
        Student student2 = new Student("郝文涌");
        Console.WriteLine(student2.Name);
        Console.WriteLine(student2.Sex);
    }
}
class People
{
    public string Name { get; set; }
    public char Sex { get; set; }
    //类里面可以拥有多个同名但不同参数的方法,
    public People()
    { Console.WriteLine("Peopl的无参构造"); }
​
    public People(string name, char sex)
    {
        Console.WriteLine("Peopl的有参构造");
        Name = name;
        Sex = sex;
    }
}
class Student : People
{
    // 子类 被创建 的时候,会默认 执行父类的 无参构造方法,不会执行 有参构造方法
    //public Student():base()  自动生成 这样的代码,等价与 直接执行的是 父类的 无参构造方法
    public Student() : base()
    { Console.WriteLine("Student的无参构造"); }
    //子类中使用 base 表示父类
    //this  表示当前类
    //在子类的 构造函数后面添加 :base() 可以 直接执行父类的构造方法  
    public Student(string name) : base(name, '男')
    { Console.WriteLine("Student的有参构造"); }
}
•访问修饰符:

public :公共的 公开的 ,当前类,子类,实例都可以访问

internal:只能在当前项目访问

protected:只有该类及子类可以访问,实例不能访问

private:私有的,仅能在当前类的内部访问,子类和实例都不能访问

protected internal:访问范围是当前程序集或继承该类的子类,满足任一条件即可访问

private protected:仅允许当前程序集内的子类访问,限制范围更严格

internal class Program
{
    static void Main(string[] args)
    {
        Student student = new Student();
        Console.WriteLine(student.a);
        //Console.WriteLine(student.b);
        Console.WriteLine(student.c);
       //Console.WriteLine(student.e);
        Console.WriteLine(student.e);
        student.Test();
    }      
}
public class People
{
    public int a = 111;
    private int b = 222;
    internal int c = 333;
    protected int d = 444;
    protected internal int e = 555;
    public void Test()
    {
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);
        Console.WriteLine(d);
        Console.WriteLine(e);
    }
}
class Student : People
{
    public void Test()
    {
        Console.WriteLine(a);
        //Console.WriteLine(b);
        Console.WriteLine(c);
        Console.WriteLine(d);
        Console.WriteLine(e);
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值