我们说我们有两节课。第一个是人
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; }
}
}
第二个是老师
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; }
}
}
我想在列表中添加老师
Teacher teacher = new Teacher() {FirstName="Peter", LastName="Janson",Position="boss" };
List <Person> people= new List<Person> { };
people.Add(teacher);
如果此列表属于类型且人员只有FirstName和LastName属性以及&#34;老师&#34;我怎么可能在列表中添加教师?还有一个职位属性?
答案 0 :(得分:8)
根据您之前提出的问题,我认为您在解决多态问题时遇到了一些问题。
尝试将继承视为汽车与车辆之间的关系。车辆是基本类型,汽车,摩托车,飞机,卡车等是衍生型。
public class Vehicle
{
public string Model {get;set;}
}
想象一下你有一个飞机库:
List<Vehicle> hangar = new List<Vehicle>();
您可以将多个不同的车辆停放在飞机库中,因为它非常大:
hangar.Add(new Plane());
hangar.Add(new Car());
虽然它们的类型不同,但它们仍然继承车辆,因此它们可以存储为车辆。
事实上,飞机有翅膀,而车却没有。如果您只是乘坐第一辆车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;
}
使用C#7语法,您也可以使用以下简化形式:
if (hangar[0] is Car car)
{
string registrationNumber = car.RegistrationNumber;
}
else if (hangar[0] is Plane plane)
{
int numberOfWings = plane.NumberOfWings;
}
与现实生活的类比是,如果你进入机库,你必须要看看汽车的位置以及飞机的位置。这里也一样。
多态性允许您将许多派生类视为它们的共同基础。在您的人员示例中,如果您希望能够按名称搜索某人,这将非常有用。老师是一个人,医生是一个人,他们都是人,他们都有名字,所以在这种情况下你可以对待他们。
把它想象成快速约会 - 你去和你见面的人。你先做什么?你问对方的名字。然后你问“你做什么工作?”他们说“我是老师”或“我是医生”。现在你知道它们是什么类型,你可以问他们“你教什么?”或者“你专攻什么医学分支?”
我希望这能让你更清楚: - )
答案 1 :(得分:7)
这是一个关于称为多态的基本面向对象概念的问题。 Teacher
是Person
,但您的Person
个实例列表只知道它包含Person
个实例的列表;它不知道从Person
派生的类,也不需要。
如果您正在使用列表中的元素,则可以确定其类型,然后将类型转换为,如下所示:
foreach (Person x in people)
{
if (x is Teacher)
{
Teacher y = (Teacher) x;
}
}
然后,您可以访问教师的属性:y.Position
。