C # method overload

I am new to C # and trying to figure out how I can easily implement the following:

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?    
    }
}

Attempted to process the following message:

public class TriggerMessage : IMessage
{
    string identifier { get; set; }

    public TriggerMessage(string triggerIdentifier)
    {
        identifier = triggerIdentifier;
    }
}

public interface IMessage
{

}

I expected the following to be triggered:

public void HandleMessage(TriggerMessage message)

instead

public void HandleMessage(IMessage message)

from

ISubscriber trigger = new TriggerSUbscriber();
trigger.HandleMessage(
    new TriggerMessage()
);

Am I missing something?

+4
source share
2 answers

Your variable is triggerdefined as having a type ISubscriber(regardless of the type of the actual object). ISubscriberonly has one method signature:

void HandleMessage(IMessage message);

Thus, the compiler calls this 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 about the lack of such a method in ISubscriber, which takes a parameter int.

There are three options:

  • 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 ),

+6

, trigger ISubscriber, HandleMessage , :

void HandleMessage(IMessage message)

, , . .

ISubscriber trigger TriggerSubscriber trigger ( !), , .

+2

All Articles