当我结合接口(interface)和多态性时,我一团糟。
假设我有以下界面:
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
更改为 override
。这样,无论您知道实例是 CanSayHello
、 Person
还是 PoshPerson
,当前实例类型的方法都会运行。
关于C# 接口(interface)、多态和委托(delegate),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11177284/