pet*_*ter 0 c# inheritance linked-list list-template
假设我们有2个班级.第一个是人
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace People
{
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
第二个是老师
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace People
{
class Teacher:Person
{
public string Position { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我想在列表中添加老师
Teacher teacher = new Teacher() {FirstName="Peter", LastName="Janson",Position="boss" };
List <Person> people= new List<Person> { };
people.Add(teacher);
Run Code Online (Sandbox Code Playgroud)
如果此列表是类型且人员只有FirstName和LastName属性而且"teacher"还有Position属性,我怎么可能在列表中添加教师?
根据您之前的问题,我认为您在解决多态问题时遇到了一些问题.
试着将继承视为汽车与车辆之间的关系.车辆是基本型,并且汽车,摩托车,飞机,卡车等是派生型.
public class Vehicle
{
public string Model {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
想象一下,你有一个飞机库:
List<Vehicle> hangar = new List<Vehicle>();
Run Code Online (Sandbox Code Playgroud)
您可以将多个不同的车辆停放在飞机库中,因为它非常大:
hangar.Add(new Plane());
hangar.Add(new Car());
Run Code Online (Sandbox Code Playgroud)
虽然它们是不同的类型,但它们仍然从车辆继承,因此它们可以存储为车辆.
问题是,飞机有翅膀,而车没有.如果您只是乘坐第一辆车hangar[0],您就知道它是一辆车,您可以获得有关它的基本信息(所有车辆共有的信息):hangar[0].Model但是您必须更加具体地了解您正在访问的车辆类型想要更详细的信息.
现在,既然您可能不知道它是什么类型的车辆,您需要检查:
if (hangar[0] is Car)
{
string registrationNumber = ((Car)hangar[0]).RegistrationNumber;
}
else if (hangar[0] is Plane)
{
int numberOfWings = ((Plane)hangar[0]).NumberOfWings;
}
Run Code Online (Sandbox Code Playgroud)
使用C#7语法,您还可以使用此简化形式:
if (hangar[0] is Car car)
{
string registrationNumber = car.RegistrationNumber;
}
else if (hangar[0] is Plane plane)
{
int numberOfWings = plane.NumberOfWings;
}
Run Code Online (Sandbox Code Playgroud)
与现实生活的类比是,如果你进入机库,你必须要看看汽车的位置以及飞机的位置.这里也一样.
多态性允许您将许多派生类视为它们的共同基础.在您的人员示例中,如果您希望能够按名称搜索某人,这将非常有用.老师是一个人,医生是一个人,他们都是人,他们都有名字,所以在这种情况下,你可以对待他们.
把它想象成速度约会 - 你去和你见面的人.你先做什么?你问对方的名字.然后你问"你做什么工作?" 他们说"我是老师"或"我是医生".现在你知道它们是什么类型,你可以问他们"你教什么?" 或者"你专攻什么医学分支?"
我希望这能让你更清楚:-)
这是一个关于基于面向对象的概念的问题,称为多态.A Teacher 是 a Person,但是您的Person实例列表只知道它包含Person实例列表; 它不知道任何关于派生的类Person,也不需要它.
如果您正在使用列表中的元素,则可以确定它们的类型,然后将它们转换为该类型,如下所示:
foreach (Person x in people)
{
if (x is Teacher)
{
Teacher y = (Teacher) x;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以访问老师的属性:y.Position.