EF наследует от E
SF наследует от S
S имеет атрибут subE типа E
Объект времени выполнения типа EF вызывает AddS (S arg) из своего класса предков (E) - передает объект времени выполнения объектатип (SF)
Попытка назначения в AddS: arg.subE = this
Из прикрепленного изображения видно, что типы времени выполнения совпадают, но назначение не удается.
Ключ для изображения: E - Событие;EF - EventFrameChange;S - подписчик;SF - SubscriberFrameChange;AddS () - AddSubscriber;subE - subscribeEvent
![enter image description here](https://i.stack.imgur.com/KTrtx.png)
Пример минимального, полного и проверяемого
Этот код работает в 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);
}
}