简体   繁体   English

方法重载C#

[英]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: 有三种选择:

  1. Add the specific TriggerMessage method to the interface 将特定的TriggerMessage方法添加到接口
  2. Declare your trigger variable as TriggerSubscriber , instead of as ISubscriber , or cast it to TriggerSubscriber when calling HandleMessage : 将您的trigger变量声明为TriggerSubscriber而不是ISubscriber ,或在调用HandleMessage时将其HandleMessageTriggerSubscriber

     ((TriggerSubscriber)trigger).HandleMessage(new TriggerMessage()); 
  3. 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: 是的, triggerISubscriber类型,它只在其接口中定义了一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM