C#接口,多态性和代理

当我结合接口和多态时,我搞得一团糟.

说我有以下界面:

public Interface CanSayHello
{
     String SayHello();
}

以下课程:

public Class Person : CanSayHello
{
     public String SayHello() { return "Hey, I'm a person just saying hello to you";}
}

最后是重要的班级:

public Class PoshPerson: Person
{
     public String SayHello() { return "Hey, I'm too posh to say hello to you";}
}

我的第一个问题是以下代码会收集PoshClass或Person Class的方法吗?

public delegate String Collector();
event Collector CollectorEvent;
void GetMethod(CanSayHello c){CollectorEvent += c.SayHello;}

**GetMethod(new PoshPerson());**

如果它将从Person类中收集方法,我想我应该将Person的方法声明为virtual,并将PoshPerson的方法覆盖.
我真的希望这两个方法签名是相同的.有可能吗?

解决方法:

您的示例运行Person的方法.如果你将PoshPerson改为PoshPerson:Person,CanSayHello(你可能认为它不会改变任何东西,因为Person:CanSayHello),它运行PoshPerson的方法.

我同意@millimoose:“我会尽可能地避免方法隐藏,正是因为编译时多态性不是很直观.”我建议您将Person.SayHello更改为virtual,并将PoshPerson.SayHello更改为覆盖.这样,无论您是将实例知道为CanSayHello,Person还是PoshPerson,都会运行当前实例类型的方法.

上一篇:java – 将超类作为参数传递给期望子类的方法


下一篇:在Java中如何引用子类变量而不在父类中声明该变量?