Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Akka.Net演员的继承_C#_Akka_Akka.net - Fatal编程技术网

C# 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

我想知道,如何用Akka.Net实现继承。我希望基本参与者处理基本消息,子参与者处理子消息

例如,我有以下层次结构:

公共类基本消息
{
公共字符串数据{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;
        }
    }
}