C#初级——继承

继承

继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类(父类) ,这个新的类被称为派生类(子类)

父类与子类

访问修饰符 class 父类名
{
...
}
class 子类名 : 父类名
{
...
}

父类中,不是所有的属性和方法都会继承给子类的。

  • public :子类和其他都可以访问
  • protected :外部不能访问,自己和子类可以访问
  • privated :只能在该类中访问,不能继承
cs 复制代码
    class Animal
    {
        public int age;
        public string name;

        //外部不能访问,自己和子类可以访问
        protected int money;
        //只能在该类中访问,不能继承
        private int home;
    }

    //public 成员和 protected 成员都会被继承过来
    class Cat : Animal
    {
        public int legs = 4;
    }

    class Duck : Animal
    {
        public int legs = 2;
    }

调用函数

派生类可以通过关键字base来调用基类的构造函数和方法。

cs 复制代码
    class Animal
    {
        public int age;
        public string name;

        //外部不能访问,自己和子类可以访问
        protected int money;
        //只能在该类中访问,不能继承
        private int home;

        public Animal(int inAge, string inName, int inMoney)
        {
            age = inAge;
            name = inName;
            money = inMoney;
            Console.WriteLine("Animal 的构造函数被调用了!");
        }

        public virtual void Cry()
        {
            Console.WriteLine("Animal:动物叫");
        }
    }

    //public 成员和 protected 成员都会被继承过来
    class Cat : Animal
    {
        public int legs = 4;

        //派生类可以通过关键字base来调用基类的构造函数。
        public Cat(int inAge, string inName, int inMoney):base(inAge, inName, inMoney)
        {
            Console.WriteLine("Cat 的构造函数被调用了!");
        }
        public override void Cry()
        {
            //派生类可以通过关键字base来调用基类的方法。
            base.Cry();
            Console.WriteLine("喵喵喵");
        }
    }

    class Duck : Animal
    {
        public int legs = 2;
        //派生类可以通过关键字base来调用基类的构造函数。
        public Duck(int inAge, string inName, int inMoney):base (inAge, inName, inMoney)
        {
            Console.WriteLine("Duck的构造函数被调用了!");
        }
        public override void Cry()
        {
            //派生类可以通过关键字base来调用基类的方法。
            base.Cry();
            Console.WriteLine("嘎嘎嘎");
        }
    }

基类的初始化

派生类继承了基类的成员变量和成员方法。因此父类对象应在子类对象创建之前被创建。

cs 复制代码
        static void Main(string[] args)
        {
            Animal animal = new Animal(1, "动物", 2);
            animal.Cry();
            Cat sonObj = new Cat(10, "猫", 100);
            sonObj.Cry();
            Console.WriteLine(sonObj.name);

            //使用基类的类型存放子类的对象
            Animal obj1 = new Cat(5, "猫", 101);
            obj1.Cry();

            Animal obj2 = new Duck(2, "鸭子", 2);
            obj2.Cry();
        }
相关推荐
leoZ2315 小时前
第 8 篇:与 AI 协作的工作流 + 完整案例
前端·人工智能·神经网络·自然语言处理·性能优化·c#·php
fujisheng6617 小时前
Unity 异步 UI 实战:取消令牌、版本校验与旧句柄隔离
c#·unity3d
额鹅恶饿呃7 小时前
随着CentOS官方停服的时间越来越久,大量仍在使用CentOS7的企业和运维从业者
java·python·算法·c#·ruby
乌药ice8 小时前
c#中一个多线程安全的HashSet
开发语言·c#
lfSeanDragon8 小时前
数据结构-前缀树(Trie)
开发语言·c#
张人玉8 小时前
基于 C# WinForms + .NET 8 + SQLite + TCP Socket 的多连接通讯调试工具——TCP通讯助手(TcpAssistant)
tcp/ip·sqlite·c#·.net
mldong16 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
samble20 小时前
从零搭建工业控制系统(二十二):线程安全与并发控制
c#·wpf·并发·mvvm·线程安全·工业控制
UIU11421 小时前
scanf与cout的误区:探究其内部的机制
c++·学习·c#·scanf
风云1 天前
MiniLog 1.0 GA 发布:零分配、零依赖的 .NET 高性能日志框架
开源·c#·.net·日志·高性能·minilog