封装、继承、多态
案例一: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();
}
}
}
【执行结果】
【注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();
}
}
}
【执行结果】
【继承关系的三个特性】
①传递性,从上往下传递(孙子可以调用爷爷)
②单向传递
③单根性(儿子只能有一个爸爸)
案例三:汇报工作
【定义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();
}
}
}
【执行结果】