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 に答える