c# - 方法重载 C#

标签 c# methods overloading

我是 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 参数。

共有三个选项:

  1. 在接口(interface)中添加具体的TriggerMessage方法
  2. 将您的 trigger 变量声明为 TriggerSubscriber,而不是 ISubscriber,或者将其转换为 TriggerSubscriber 当调用 HandleMessage 时:

    ((TriggerSubscriber)trigger).HandleMessage(new TriggerMessage());
    
  3. 在实现中解决:

    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/

相关文章:

c# - 用于关闭 Windows 窗体应用程序的事件处理程序

android - 方法 XYZ 的代码超出了 65535 字节限制

c++ - 根据参数类型获取匹配的重载

c++ - 为什么 OpenGL 不会重载它的函数?

c# - LoadLibrary 并定义对 C DLL 的回调(函数指针)

c# - 哪种编码更有效: reusing variable vs writing same code twice?

c# - 使用 Tempdata 使我的应用程序崩溃

python - 我可以替换 Python 中对象的现有方法吗?

javascript - 关于OOP的一些问题

java - 在不支持的语言中添加可选参数时,最好的设计是什么?