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,是的,它应该;会发生什么?编辑:,很好