gpt4 book ai didi

C# 接口(interface)、多态性和委托(delegate)

转载 作者:太空狗 更新时间:2023-10-30 00:54:55 25 4
gpt4 key购买 nike

当我结合接口(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 类的方法吗?

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

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

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

最佳答案

您的示例运行Person 的方法。如果将 PoshPerson 更改为 PoshPerson : Person, CanSayHello(您可能认为这不会改变任何内容,因为 Person : CanSayHello),它运行 PoshPerson 的方法。

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

关于C# 接口(interface)、多态性和委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11177284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com