2017-02-15 13 views
0

Мне интересно, как реализовать наследование с Akka.Net. Я хочу, чтобы базовый актер обрабатывал базовые сообщения и дочерний актер для обработки дочерних сообщений.Наследование с участием Akka.Net

К примеру, я следующие иерархии:

public class BaseMessage 
{ 
    public string Data { get; set; } 
} 

public class ChildMessage : BaseMessage 
{ 
    public string ChildData { get ;set; } 
} 

public abstract class BaseActor : ReceiveActor 
{ 
    private string baseData; 

    public BaseActor() 
    { 
     Receive<BaseMessage>(m => { 
      baseData = m.Data; 
     }); 

     // be aware that adding ReceiveAny handler in base class means that you wont be able to add any handlers in descendant actors 
     // just override Unhandled method 
    } 
} 

public class MyActor : BaseActor 
{ 
    private string myData;  

    public MyActor() 
    { 
     Receive<ChildMessage>(m => { 
     myData = m.ChildData; 

     // obviously BaseActor won't receive BaseMessage 
     // so I should somehow send BaseMessage to it 

     // option 1, not sure will it work 
     BaseMessage baseMessage = m as BaseMessage; 
     Self.Tell(baseMessage); 

     // option 2, definitely should work 
     BaseMessage baseMessage = new BaseMessage { Data = m.Data }; 
     Self.Tell(baseMessage); 
     }); 
    } 
} 

вопрос: опция 1, чтобы отправить сообщение Родителя актер работу?

+0

При всем моем уважении, почему бы вам просто не попробовать? Поместите в некоторые console.logs, разверните простое консольное приложение и отправьте сообщения. – tomliversidge

+0

@tomliversidge уверен, сообщение будет обновлено после него – bonzaster

ответ

0

К сожалению, это не сработает таким образом, потому что родительский актер перехватит ChildMessage, отправленный дочернему актеру. Итак, мой раствор ниже

public class BaseMessage 
{ 
    public string Data { get; set; } 
} 

public class ChildMessage : BaseMessage 
{ 
    public string ChildData { get ;set; } 
} 

public abstract class BaseActor : ReceiveActor 
{ 
    private string baseData; 

    public BaseActor() 
    { 
     Receive<BaseMessage>(m => { 
      ProcessMessage(m); 
     }); 

     // be aware that adding ReceiveAny handler in base class means that you wont be able to add any handlers in descendant actors 
     // just override Unhandled method instead 
    } 

    protected virtual void ProcessMessage(BaseMessage m) 
    { 
     baseData = m.Data; 
    } 
} 


public class MyActor: BaseActor 
{ 
    private string myData;  

    public MyActor() 
    { 
     // no interceptor for ChildMessage here, because parent class has interceptor for BaseMessage and it will handle ChildMessage too 
    } 

    protected override void ProcessMessage(BaseMessage m) 
    { 
     base.ProcessMessage(m); 

     // not qute OOP way, but it works 
     var childMessage = m as ChildMessage; 
     if(childMessage != null) 
     { 
      myData = childMessage.ChildData; 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^