[英]Method overloading C#
I'm new to C# and trying to figure out how i can easily implement the following: 我是C#的新手,试图找出如何轻松实现以下内容:
I have a subscriber: 我有一个订阅者:
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?
}
}
Trying to handle the following message: 尝试处理以下消息:
public class TriggerMessage : IMessage
{
string identifier { get; set; }
public TriggerMessage(string triggerIdentifier)
{
identifier = triggerIdentifier;
}
}
public interface IMessage
{
}
I expected that the following would have been called: 我预计会调用以下内容:
public void HandleMessage(TriggerMessage message)
instead of 代替
public void HandleMessage(IMessage message)
with 同
ISubscriber trigger = new TriggerSUbscriber();
trigger.HandleMessage(
new TriggerMessage()
);
Am i missing something here? 我错过了什么吗?
Your trigger
variable is defined as it being of type ISubscriber
(no matter what the actual object type is). 您的
trigger
变量被定义为类型为ISubscriber
(无论实际的对象类型是什么)。 ISubscriber
only has one method signature: ISubscriber
只有一个方法签名:
void HandleMessage(IMessage message);
So the compiler calls that method. 所以编译器调用该方法。
In fact, if you did this: 事实上,如果你这样做:
class TriggerSubscriber : ISubscriber
{
public void HandleMessage(IMessage message)
{
}
public void HandleMessage(int something)
{
}
}
And then try to do this: 然后尝试这样做:
ISubscriber trigger = new TriggerSubscriber();
trigger.HandleMessage(4);
The compiler will complain that there's no such method in ISubscriber
which takes an int
parameter. 编译器会抱怨
ISubscriber
没有这样的方法,它接受一个int
参数。
There are three options: 有三种选择:
TriggerMessage
method to the interface TriggerMessage
方法添加到接口 Declare your trigger
variable as TriggerSubscriber
, instead of as ISubscriber
, or cast it to TriggerSubscriber
when calling HandleMessage
: 将您的
trigger
变量声明为TriggerSubscriber
而不是ISubscriber
,或在调用HandleMessage
时将其HandleMessage
为TriggerSubscriber
:
((TriggerSubscriber)trigger).HandleMessage(new TriggerMessage());
Solve it in the implementation: 在实施中解决它:
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) { } }
I'd definitely use #3 (and I'd call the method that receives a TriggerMessage
something like HandleTriggerMessage
, instead of having possible ambiguities), but you choose 我肯定会使用#3(我会调用接收
TriggerMessage
的方法,比如HandleTriggerMessage
,而不是可能有歧义),但是你选择了
Yes, trigger
is of type ISubscriber
which only has one HandleMessage
method defined in its interface: 是的,
trigger
是ISubscriber
类型,它只在其接口中定义了一个HandleMessage
方法:
void HandleMessage(IMessage message)
There is no other method to match from the interface definition, so that only visible method is called. 没有其他方法可以从接口定义匹配,因此只调用可见方法。 There is no overload resolution taking place here.
这里没有重载解决方案。
If you change ISubscriber trigger
to TriggerSubscriber trigger
(now there are two methods visible!) you will see you get the expected method called. 如果你将
ISubscriber trigger
更改为TriggerSubscriber trigger
(现在有两种方法可见!),你会看到你得到了预期的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.