2017-02-15 5 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.logを入れ、簡単なコンソールアプリを起動してメッセージを送信します。 – 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; 
     } 
    } 
}