Несмотря на соответствие класса / runtimetpye, назначение не удается - PullRequest
0 голосов
/ 10 февраля 2019

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

Пример минимального, полного и проверяемого

Этот код работает в 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 голосов
/ 12 февраля 2019

Если я добавлю код в обычное консольное приложение C # (настройка из-за отсутствия Unity), я вижу, что aSub имеет два свойства с именем subscribedEvent, потому что ваше поле new просто затеняет старое.Таким образом, присвоение из метода базового класса присваивает копии поля базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...