2

我有以下课程:

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.

编译器不允许这样做。我如何实现这个场景?

4

1 回答 1

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);
    }
}
于 2012-10-05T08:36:24.097 回答