2017-02-15 75 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; 
     } 
    } 
}