简体   繁体   English

与Akka.Net参与者的继承

[英]Inheritance with Akka.Net actors

I'm wondering, how to implement inheritance with Akka.Net. 我想知道如何使用Akka.Net实现继承。 I want base actor to handle base messages and child actor to handle child messages. 我希望基本actor处理基本消息,让子actor处理子消息。

For example, I have following hierarchies: 例如,我具有以下层次结构:

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

Question is: will option 1 to send message to parent actor work? 问题是:向父演员发送消息的选项1是否有效?

Unfortunatelly, it won't work in this way, because parent actor will intercept ChildMessage sent to child actor. 不幸的是,它不会以这种方式工作,因为父角色会拦截发送给子角色的ChildMessage So, my solution is below 所以,我的解决方案如下

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM