Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承:根据具体对象在运行时调用正确的方法_C#_Inheritance - Fatal编程技术网

C# 继承:根据具体对象在运行时调用正确的方法

C# 继承:根据具体对象在运行时调用正确的方法,c#,inheritance,C#,Inheritance,我有以下课程: public class Person { } public class Employee : Person { } public class Customer : Person { } 一些使用这些类的方法: public class OtherClass { public void DoSomething(Employee e) { } public void DoSomething(Customer c) { } }

我有以下课程:

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.

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

这里最简单的方法是多态性,即

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);
    }
}

这里最简单的方法是多态性,即

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);
    }
}

怎么做,因为它不工作!怎么做,因为它不工作!对不起,我错过了。DoSomething不是基类的一部分。它是另一个外部类的成员。@tkrause k,那么第一个选项可能是可能的;第二个/第三个选项应该可以正常工作,但我们不希望进行类型检查。因为每次创建新类型时,您都必须再次接触该代码。我们认为没有它它也能用。@tkrause为什么要用呢?在我所能想到的几乎每一种基于类型的语言中,这都不会以您想要的方式编译-为什么C会有所不同?然而:你有没有尝试过动态选项,它迫使系统完全按照你的要求去做?@tkrause-er,是的,它应该;会发生什么?编辑:很好,很抱歉我错过了。DoSomething不是基类的一部分。它是另一个外部类的成员。@tkrause k,那么第一个选项可能是可能的;第二个/第三个选项应该可以正常工作,但我们不希望进行类型检查。因为每次创建新类型时,您都必须再次接触该代码。我们认为没有它它也能用。@tkrause为什么要用呢?在我所能想到的几乎每一种基于类型的语言中,这都不会以您想要的方式编译-为什么C会有所不同?然而:你有没有尝试过动态选项,它迫使系统完全按照你的要求去做?@tkrause-er,是的,它应该;会发生什么?编辑:,很好