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
最小,完整和可验证的示例
此代码在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);
}
}
答案 0 :(得分:0)
如果将代码仅放入普通的C#控制台应用程序(由于缺乏Unity),我会发现aSub
有两个名为subscribedEvent
的属性,因为您的new
字段只是阴影旧的。因此,从基类方法中进行的分配就是分配给该字段的基类副本。