三十一、C#中的继承(含案例)

1.面向对象特征

封装、继承、多态

 

2.继承

案例一:PM 和 SE 的 SayHi() 方法

【创建一个公共类】

namespace demo15
{
    /// 
    /// 性别
    /// 
    public enum Gender
    {
        男, 女
    }
    /// 
    /// 公共类
    /// 
    public class Common
    {
        /// 
        /// 软件名称
        /// 
        public static string projectName = "学生管理系统";
        /// 
        /// 版本号
        /// 
        public static string version = "1.0";
    }
}

【创建一个公共的员工类】

namespace demo15
{
    /// 
    /// 员工类(抽象出来的父类)
    /// 
    public class Employee
    {
        public Employee() { }
        public Employee(int id,int age,string name,Gender gender) 
        {
            this.ID = id;
            this.Age = age;
            this.Name = name;
            this.Gender = gender;
        }
        public int ID { get; set; }
        public int Age { get; set; }
        public string Name { get; set; }
        public Gender Gender { get; set; }//枚举类型
    }
}

【创建一个项目经理类】

namespace demo15
{
    /// 
    /// 项目经理类
    /// 
    public class PM : Employee //继承之后,字类将会拥有父类除私有修饰符之外的所有的内容
    {       
        public PM() { }
        //继承父类Employee中的属性
        public PM(int yearofexperience, int id, int age, string name, Gender gender) 
            : base(id, age, name, gender)
        {
            this.YearOfExperience = yearofexperience;
        }
        public int YearOfExperience { get; set; }// 项目管理经验
        /// 
        /// 打招呼(项目经理)
        /// 
        public void SayHi()//base  调用父类信息,this  表示当前对象
        {
            Console.WriteLine($"大家好!我是{base.Name},是一个项目经理,我有{this.YearOfExperience}年的项目管理经验");
        }
    }
}

【创建一个程序员类】

namespace demo15
{
    /// 
    /// 程序员类
    /// 
    public class SE : Employee
    { 
        public SE() { }
        //继承父类Employee中的属性
        public SE(int pop,int id,int age,string name,Gender gender):base(id,age,name,gender) 
        {
            this.Pop = pop;
        }
        public int Pop { get; set; }// 人气值
        /// 
        /// 打招呼
        /// 
        public void SayHi()
        {
            Console.WriteLine($"大家好!我是{base.Name},是一名程序员,我的人气值是{this.Pop}");
            //这里使用到了父类的属性,可以写成this.Name,在使用上正常,但是为了规范和区分,一般写成base.Name
        }
    }
}

【在main()方法中调用】

namespace demo15
{
    class Program
    {
        static void Main(string[] args)
        {
            PM pm1 = new PM();
            pm1.ID = 1001;
            pm1.Name = "john";
            pm1.Gender = Gender.男;
            pm1.Age = 31;
            pm1.YearOfExperience = 10;
            pm1.SayHi();

            SE se1 = new SE();
            se1.ID = 1002;
            se1.Name = "lily";
            se1.Gender = Gender.女;
            se1.Age = 19;
            se1.Pop = 98;
            se1.SayHi();

            //成员执行顺序:static静态标识 > 字段/属性 > 构造方法(父类) > 构造方法(子类)
            SE se2 = new SE(80, 1003, 24, "mary", Gender.女);
            se2.SayHi();

            PM pm2 = new PM(11, 1004, 40, "sherry", Gender.女);
            pm2.SayHi();

            //is  判断对象是否为某类型
            Console.WriteLine(se1 is Employee);
            Console.WriteLine(pm1 is Employee);
            Console.WriteLine(se2 is Employee);
            Console.WriteLine(pm2 is Employee);
                        
            Console.ReadLine();

        }
    }
}

【执行结果】

三十一、C#中的继承(含案例)_第1张图片

【注1】is a 关系:

SE is a Employee

PM is a Employee

【注2】继承关系访问修饰符:

在父类中用protected 修饰符(受访问限制)修饰的字段/属性或方法,只能在继承它的子类或其本身中调用

【注3】父类要提供无参的构造函数

子类的构造方法中如果没有显示的指明继承父类(没有写:base()),默认调用的是父类的无参构造函数;

如果父类没有无参的构造函数,子类构造函数必须指明调用父类哪个构造函数

 

案例二:模拟汽车行驶

创建汽车(Vehicle类)类,添加属性:类型、产地,以及构造方法

给Vehicle类添加方法VehicleRun()

创建卡车(Truck类)类,继承Vehicle类,添加构造函数

给Truck类添加方法TruckRun()

编写测试方法

【创建汽车类】

namespace demo15_2
{
    public class Vehicle
    {
        public Vehicle() { }
        public Vehicle(string type,string place)
        {
            this.Type = type;
            this.Place = place;
        }
        public string Type { get; set; }
        public string Place { get; set; }
        public void Run()
        {
            Console.WriteLine($"产自{this.Place}的{this.Type}汽车在奔跑!");
        }
    }
}

【创建卡车类】

namespace demo15_2
{
    public class Truck:Vehicle
    {
        public Truck() { }
        public Truck(string color,string type,string place):base(type,place)
        {
            this.Color = color;
        }
        public string Color { get; set; }
        public void TruckRun()
        {
            Console.WriteLine($"我是一辆{base.Type}牌卡车,我产自{base.Place},我是{this.Color}的,我在行驶!");
        }
    }
}

【创建小型卡车类】

namespace demo15_2
{
    public class SmallTruck:Truck
    {
        public SmallTruck() { }
        public SmallTruck(int floor,string color, string type, string place) : base(color, type, place)
        {
            this.Floor = floor;
        }
        public int Floor { get; set; }
        public void SmallTruckRun()
        {
            Console.WriteLine($"我是一辆{base.Type}牌小型卡车,我产自{base.Place},我是{base.Color}色的!我有{this.Floor}层高!");
        }
    }
}

【调用】

namespace demo15_2
{
    class Program
    {
        static void Main(string[] args)
        {
            Vehicle vehicle = new Vehicle("奔驰", "上海");
            vehicle.Run();
            Console.WriteLine();

            Truck truck = new Truck("宝石蓝色","三星", "中国" );
            truck.TruckRun();
            truck.Run();
            Console.WriteLine();

            SmallTruck smallTruck = new SmallTruck(2, "黄色", "红菱", "山东");
            smallTruck.SmallTruckRun();
            smallTruck.TruckRun();
            smallTruck.Run();
            Console.WriteLine();

            Console.ReadLine();
        }
    }
}

【执行结果】

三十一、C#中的继承(含案例)_第2张图片

【继承关系的三个特性】

①传递性,从上往下传递(孙子可以调用爷爷)

②单向传递

③单根性(儿子只能有一个爸爸)

 

案例三:汇报工作

【定义Employee类】

namespace demo15_3
{
    public enum Gender
    {
        男,女
    }
    public class Employee
    {
        public Employee() { }
        public Employee(int id, int age, string name, Gender gender)
        {
            this.ID = id;
            this.Age = age;
            this.Name = name;
            this.Gender = gender;
        }
        public int ID { get; set; }
        public int Age { get; set; }
        public string Name { get; set; }
        public Gender Gender { get; set; }//枚举类型

        public List JobList { get; set; }//集合  用于存放多个工作任务
    }
}

【定义PM类】

namespace demo15_3
{
    public class PM : Employee
    {
        public PM() { }

        public PM(int yearofexperience, int id, int age, string name, Gender gender)
            : base(id, age, name, gender)
        {
            this.YearOfExperience = yearofexperience;
        }
        public int YearOfExperience { get; set; }// 项目管理经验

        public void SayHi()
        {
            Console.WriteLine($"大家好!我是{base.Name},是一个项目经理,我有{this.YearOfExperience}年的项目管理经验");
        }
        /// 
        /// 项目经理工作方法
        /// 
        public void DoWork()
        {
            foreach (Job job in base.JobList)
            {
                Console.WriteLine($"项目经理{base.Name}正在{job.Description}!");
            }
        }
    }
}

【定义SE类】

namespace demo15_3
{
    public class SE : Employee
    {
        public SE() { }
        public SE(int pop, int id, int age, string name, Gender gender) : base(id, age, name, gender)
        {
            this.Pop = pop;
        }
        public int Pop { get; set; }// 人气值

        public void SayHi()
        {
            Console.WriteLine($"大家好!我是{base.Name},是一名程序员,我的人气值是{this.Pop}");            
        }
        /// 
        /// 程序员工作方法
        /// 
        public void DoWork()
        {
            foreach (Job job in base.JobList)
            {
                Console.WriteLine($"程序员{base.Name}正在{job.Description}!");
            }
        }
    }
}

【定义Job类】

namespace demo15_3
{
    /// 
    /// 工作类
    /// 
    public class Job
    {
        public string Name { get; set; }//工作类目
        public string Description { get; set; }//工作内容
    }
}

【调用】

namespace demo15_3
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建工作列表(针对项目经理)
            List list2 = new List
            {
                new Job(){ Name="写代码", Description="设计注册界面" },
                new Job(){ Name="写代码", Description="设计登录界面" },
                new Job(){ Name="写代码", Description="设计首页界面" }
            };
            //创建一个项目经理
            PM pm1 = new PM(10, 1001, 39, "李四", Gender.女);
            //分配工作
            pm1.JobList = list2;
            //执行工作
            //pm1.DoWork();


            //创建工作列表(针对程序员)
            List list1 = new List
            {
                new Job(){ Name="写代码", Description="做学生管理系统的注册界面" },
                new Job(){ Name="写代码", Description="做学生管理系统的登录界面" },
                new Job(){ Name="写代码", Description="做学生管理系统的首页界面" }
            };
            List list3 = new List
            {
                new Job(){ Name="写代码", Description="测试注册界面" },
                new Job(){ Name="写代码", Description="测试登录界面" },
                new Job(){ Name="写代码", Description="测试首页界面" }
            };


            //创建一个程序员
            SE se1 = new SE(99, 1001, 19, "张三", Gender.男);
            SE se2 = new SE(99, 1001, 19, "王五", Gender.男);
            //分配工作
            se1.JobList = list1;
            se2.JobList = list3;
            //执行工作
            //se1.DoWork();
            //se2.DoWork();


            //泛型集合Employee  程序员和员工是is a关系;项目经理和员工也是is a关系
            List empList = new List();
            empList.Add(pm1);
            empList.Add(se1);
            empList.Add(se2);

            foreach (Employee emp in empList)
            {
                if (emp is SE)//如果判断对象是程序员
                {
                    SE se = emp as SE;
                    se.DoWork();
                }
                else if(emp is PM)//如果判断对象是项目经理
                {
                    PM pm = emp as PM;
                    pm.DoWork();
                }
            }

            Console.Read();
        }
    }
}

【执行结果】

三十一、C#中的继承(含案例)_第3张图片

 

 

 

 

你可能感兴趣的:(C#,c#)