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# - 将 Lua 编辑器集成到 C# 程序中

c# - 获取泛型方法以从运行时类型推断类型参数

c++ - 模板化类的特殊继承导致成员函数返回模板化类类型而不是继承类类型

c# - 如何从 TFS 获取所有集合

c# - 使用 Dependency Resolver 是一种不好的做法吗?

c# - 在 wpf 网络浏览器中捕获和取消新窗口打开事件

java - 如何在Java中实现方法链?

python - 是否可以在没有 @staticmethod 属性的方法内运行 print() ?

ruby - Ruby 方法 'to_sym' 有什么作用?

基于可选参数存在而不使用函数重载的 typescript 函数返回类型