尽管类/运行时匹配,但分配失败

时间:2019-02-09 23:18:35

标签: c# inheritance

EF继承自E
SF继承自S
S具有类型E的属性subE
EF类型的运行时obj从其祖先类(E)调用AddS(S arg)-传递类型(SF)的运行时obj
分配尝试在AddS中:arg.subE = this
从所附图像中可以看到运行时类型匹配,但是分配失败。

图片密钥:E-事件; EF-EventFrameChange; S-订阅者; SF-SubscriberFrameChange; AddS()-AddSubscriber; subE-subscriptionedEvent

enter image description here

最小,完整和可验证的示例

此代码在Unity中有效。在场景中创建一个空的GameObject并添加一个SpriteAnimatorScript作为组件。

using UnityEngine;

public abstract class Event : ScriptableObject
{
    public Subscriber[] subscribers;

    public void AddSubscriber(Subscriber aSub)
    //
    {
        aSub.subscribedEvent = this;
    }
}

using UnityEngine;

public class EventFrameChange : Event
{
    private SpriteAnimatorScript animatorScript;

    public void Initialize()
    // ^ 
    {
        subscribers = new Subscriber[0];
    }

}

using UnityEngine;

public abstract class Subscriber : ScriptableObject
{
    public Event subscribedEvent;
    // ^ Event this is a subscription to.

    public virtual void SetEvent(Event aEvent)
    {
        subscribedEvent = aEvent;
    }

}

using UnityEngine;

public class SubscriberFrameChange : Subscriber
{
    public new EventFrameChange subscribedEvent;
}

using UnityEngine;

public class SpriteAnimatorScript : MonoBehaviour 
{
    public EventFrameChange eventFrameChange;

    public SubscriberFrameChange subscriberFrameChange;

    void Start () 
    {
        SetupEvents();
    }

    private void SetupEvents()
    {
        eventFrameChange = ScriptableObject.CreateInstance<EventFrameChange>();
        subscriberFrameChange = ScriptableObject.CreateInstance<SubscriberFrameChange>();
        eventFrameChange.AddSubscriber(subscriberFrameChange);
    }

}

1 个答案:

答案 0 :(得分:0)

如果将代码仅放入普通的C#控制台应用程序(由于缺乏Unity),我会发现aSub有两个名为subscribedEvent的属性,因为您的new字段只是阴影旧的。因此,从基类方法中进行的分配就是分配给该字段的基类副本。