using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace thinger.cn.TeachDemo01e
{
public abstract class Person
{
public Person() { }
public Person(string idNo, string name)
{
this.IDNo = idNo;
this.Name = name;
}
public string IDNo { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
//这两个是抽像方法
public abstract void Dowork();
public abstract void Rest();
//虚方法
public virtual string GetInfo()
{
return $"编号:{IDNo } 姓名:{Name}";
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace thinger.cn.TeachDemo01e
{
public class Student : Person
{
public Student() { }
public Student(string idNo, string name)
{
base.IDNo = idNo;
base.Name = name;
}
//重写父类的抽象方法
public override void Dowork()
{
Console.WriteLine("我们是做电气工程师和.NET软件开发的!");
}
public override void Rest()
{
Console.WriteLine("我们都是在下班后,很晚才休息!");
}
/// <summary>
///重写虚方法
/// </summary>
/// <returns></returns>
public override string GetInfo()
{
//子类中可以继续调用父类的虚方法获其他可用的方法
return base.GetInfo() + " 性别:" + base.Gender;
}
public override string ToString()
{
return base.ToString();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//修改成不同的命名空间
namespace thinger.cn.TeachDemo01e
{
//注意,练习的时候,一定要修改命名空间,才能使用相同的类名
class Teacher : Person
{
public Teacher() { }
public Teacher(string idNo, string name)
{
base.IDNo = idNo;
base.Name = name;
}
//重写的父类方法
public override void Dowork()
{
Console.WriteLine("我们每天要上课,答疑、备课、做测试!");
}
public override void Rest()
{
Console.WriteLine("下班后,学员问题解答后,很晚才休息!");
}
//子类特有的方法
public void Chat()
{
Console.WriteLine("陪家人聊天!");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace thinger.cn.TeachDemo01e
{
class Test2
{
//抽象方法重写后的测试
public void MyTest()
{
Teacher teacherChang = new Teacher();
teacherChang.Name = "常老师";
teacherChang.Dowork();
teacherChang.Rest();
//下面这个是子类特有的方法
teacherChang.Chat();
Student studentYi = new Student();
studentYi.Name = "易同学";
studentYi.Dowork();
studentYi.Rest();
}
public void YourTest()
{
Person teacherChang = new Teacher();
teacherChang.Name = "常老师";
teacherChang.Dowork();
teacherChang.Rest();
//下面这个是子类特有的方法
// teacherChang.Chat();
Person studentYi = new Student();
studentYi.Name = "易同学";
studentYi.Dowork();
studentYi.Rest();
}
public void OhterTest()
{
//Teacher teacherChang = new Teacher();
//Student studentYi = new Student();
//CoreTest(teacherChang);
//CoreTest(studentYi);
//下面的写法和上面的是一样的
CoreTest(new Teacher());
CoreTest(new Student());
//对于调用者来讲,不用关系具体子类对象
Person p = GetPerson();
}
/// <summary>
/// 多态实现1:父类作为方法的参数,实际传递的是具体子累
///
/// 好处:我们在写这个方法的时候,根本不考虑方法参数传递什么样的子类
/// </summary>
/// <param name="person"></param>
public void CoreTest(Person person)
{
person.Dowork();
person.Rest();
person.GetInfo();
}
/// <summary>
/// 多态的实现2:父类作为方法的返回值类型,实际返回的是具体子类
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
//public Person GetPerson(string type)
//{
// if (type == "teacher")
// return new Teacher();
// else
// return new Student();
// //通过反射可以这部分封闭
//}
public Person GetPerson()
{
return new Teacher();//通过反射可以这部分封闭,返回不同的子类
}
}
}