我是 C# 的新手,正在尝试弄清楚如何轻松实现以下内容:
我有一个订阅者:
public interface ISubscriber
{
void HandleMessage(IMessage message);
}
class TriggerSubscriber : ISubscriber
{
public void HandleMessage(IMessage message)
{
//This will be called by default
}
public void HandleMessage(TriggerMessage message)
{
//This won't work, why?
}
}
正在尝试处理以下消息:
public class TriggerMessage : IMessage
{
string identifier { get; set; }
public TriggerMessage(string triggerIdentifier)
{
identifier = triggerIdentifier;
}
}
public interface IMessage
{
}
我预计会调用以下内容:
public void HandleMessage(TriggerMessage message)
代替
public void HandleMessage(IMessage message)
与
ISubscriber trigger = new TriggerSUbscriber();
trigger.HandleMessage(
new TriggerMessage()
);
我是不是漏掉了什么?
最佳答案
您的 trigger
变量被定义为 ISubscriber
类型(无论实际对象类型是什么)。 ISubscriber
只有一个方法签名:
void HandleMessage(IMessage message);
因此编译器调用该方法。
事实上,如果你这样做:
class TriggerSubscriber : ISubscriber
{
public void HandleMessage(IMessage message)
{
}
public void HandleMessage(int something)
{
}
}
然后尝试这样做:
ISubscriber trigger = new TriggerSubscriber();
trigger.HandleMessage(4);
编译器会提示 ISubscriber
中没有这样的方法,它接受一个 int
参数。
共有三个选项:
- 在接口(interface)中添加具体的
TriggerMessage
方法 将您的
trigger
变量声明为TriggerSubscriber
,而不是ISubscriber
,或者将其转换为TriggerSubscriber
当调用HandleMessage
时:((TriggerSubscriber)trigger).HandleMessage(new TriggerMessage());
在实现中解决:
class TriggerSubscriber : ISubscriber { public void HandleMessage(IMessage message) { var triggerMessage = message as TriggerMessage; if(triggerMessage != null) { // Casting is not necessary, but I'd still put it // here just to make it clear HandleMessage((TriggerMessage)triggerMessage); return; } // other code } public void HandleMessage(TriggerMessage message) { } }
我肯定会使用#3(并且我会调用接收 TriggerMessage
的方法,比如 HandleTriggerMessage
,而不是可能有歧义),但你选择
关于c# - 方法重载 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36128882/