C# Akka.Net演员的继承
我想知道,如何用Akka.Net实现继承。我希望基本参与者处理基本消息,子参与者处理子消息 例如,我有以下层次结构:C# Akka.Net演员的继承,c#,akka,akka.net,C#,Akka,Akka.net,我想知道,如何用Akka.Net实现继承。我希望基本参与者处理基本消息,子参与者处理子消息 例如,我有以下层次结构: 公共类基本消息 { 公共字符串数据{get;set;} } 公共类ChildMessage:BaseMessage { 公共字符串ChildData{get;set;} } 公共抽象类BaseActor:ReceiveActor { 私有字符串基数据; 公共BaseActor() { 接收(m=>{ baseData=m.数据; }); //请注意,在基类中添加ReceiveAn
公共类基本消息
{
公共字符串数据{get;set;}
}
公共类ChildMessage:BaseMessage
{
公共字符串ChildData{get;set;}
}
公共抽象类BaseActor:ReceiveActor
{
私有字符串基数据;
公共BaseActor()
{
接收(m=>{
baseData=m.数据;
});
//请注意,在基类中添加ReceiveAny处理程序意味着您将无法在后代参与者中添加任何处理程序
//只重写未处理的方法
}
}
公共类MyActor:BaseActor
{
私有字符串myData;
公共MyActor()
{
接收(m=>{
myData=m.ChildData;
//显然BaseActor不会收到BaseMessage
//所以我应该以某种方式向它发送基本信息
//选项1,不确定它是否有效
BaseMessage BaseMessage=m作为BaseMessage;
Self.Tell(baseMessage);
//选择2,肯定会奏效
BaseMessage BaseMessage=newBaseMessage{Data=m.Data};
Self.Tell(baseMessage);
});
}
}
问题是:向父参与者发送消息的选项1会起作用吗?不幸的是,它不会以这种方式起作用,因为父参与者将拦截发送给子参与者的子消息。因此,我的解决方案如下
公共类基本消息
{
公共字符串数据{get;set;}
}
公共类ChildMessage:BaseMessage
{
公共字符串ChildData{get;set;}
}
公共抽象类BaseActor:ReceiveActor
{
私有字符串基数据;
公共BaseActor()
{
接收(m=>{
处理消息(m);
});
//请注意,在基类中添加ReceiveAny处理程序意味着您将无法在后代参与者中添加任何处理程序
//只需重写未处理的方法即可
}
受保护的虚拟void ProcessMessage(BaseMessage)
{
baseData=m.数据;
}
}
公共类MyActor:BaseActor
{
私有字符串myData;
公共MyActor()
{
//这里没有用于ChildMessage的拦截器,因为父类有用于BaseMessage的拦截器,并且它也将处理ChildMessage
}
受保护的覆盖无效ProcessMessage(BaseMessage)
{
base.ProcessMessage(m);
//不是用quteoop的方式,但它是有效的
var childMessage=m作为childMessage;
if(childMessage!=null)
{
myData=childMessage.ChildData;
}
}
}
恕我直言,你为什么不试试呢?!放入一些console.log,启动一个简单的控制台应用程序并发送消息。@tomliversidge当然,发布后会更新
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;
}
}
}