2017-02-15 5 views
0

Ich frage mich, wie man Vererbung mit Akka.Net implementieren. Ich möchte, dass der Basis-Akteur Basis-Nachrichten und der Kind-Akteur behandelt, um mit Kind-Nachrichten umzugehen.Vererbung mit Akka.Net Schauspielern

Zum Beispiel habe ich folgende Hierarchien:

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); 
     }); 
    } 
} 

Frage ist: Wird die Option 1 Nachricht an Mutter Schauspieler arbeiten zu schicken?

+0

Bei allem Respekt, warum Sie nicht einfach ausprobieren ?! Legen Sie einige console.logs an, starten Sie eine einfache Konsolenanwendung und senden Sie die Nachrichten. – tomliversidge

+0

@tomliversidge sicher, Post wird danach aktualisiert – bonzaster

Antwort

0

Leider wird es auf diese Weise nicht funktionieren, weil der übergeordnete Akteur ChildMessage abfangen wird, die an untergeordneten Akteur gesendet wird. Also, meine Lösung ist unter

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; 
     } 
    } 
} 
Verwandte Themen