我有以下课程:
public class Person
{
}
public class Employee : Person
{
}
public class Customer : Person
{
}
使用这些类的一些方法:
public class OtherClass
{
public void DoSomething(Employee e)
{
}
public void DoSomething(Customer c)
{
}
}
电话:
// People = Collection<Person>.
foreach (var p in People)
DoSomething(p); // Should call the right method at runtime and "see" if it´s an Employee or a Customer.
编译器不允许这样做。我该如何实现这种情况?
答案 0 :(得分:4)
这里最简单的方法是多态,即
public class Person
{
public virtual void DoSomething() {} // perhaps abstract?
}
public class Employee : Person
{
public override void DoSomething() {...}
}
public class Customer : Person
{
public override void DoSomething() {...}
}
并使用:
foreach (var p in People)
p.DoSomething();
无论其!如果那是不可能的,那就作弊:
foreach (var p in People)
DoSomething((dynamic)p); // TADA!
另一个选择是自己检查类型:
public void DoSomething(Person p)
{
Employee e = p as Employee;
if(e != null) DoSomething(e);
else {
Customer c = p as Customer;
if(c != null) DoSomething(c);
}
}