Правильное использование наследования - PullRequest
1 голос
/ 15 апреля 2020

Мне сложно это объяснить, но я постараюсь объяснить ситуацию. У меня есть два класса. IntroductionState и State_episode1. IntroductionState наследуется от State_episode1. Я создаю много State_episode1 производных классов, которые вызывают Start(), но я хочу, чтобы каждый производный класс вызывал свой собственный MyStartCoroutine(), поэтому при вызове базового Start() метода он будет вызывать производный пользовательский метод. Есть ли простой способ сделать это, или я должен просто скопировать метод paste Start () для каждого производного класса?

Следующий код выдает ошибку «Никакая сопрограмма не запущена», когда я пытаюсь вызвать StartCoroutine(MyStartCoroutine()):

public class State_episode1
{
    public StateMachine_Episode1 Ep1;

    public State_episode1(StateMachine_Episode1 ep1)
    {
        Ep1 = ep1;
    }

    //start begins a coroutine which first has to set _state=2 for the state machine to continue
    public IEnumerator Start()
    {
        Ep1._state = 1;
        yield return Ep1.StartCoroutine(MyStartCoroutine());
        Ep1._state = 2;
    }
    public IEnumerator MyStartCoroutine()
    {
        Debug.Log("no coroutine started");
        yield return new WaitForSeconds(1);
    }
}

public class IntroductionState: State_episode1
{
    public IntroductionState(StateMachine_Episode1 ep1) : base(ep1)
    {
    }
    public new IEnumerator MyStartCoroutine()
    {
        return base.MyStartCoroutine();
    }
}

1 Ответ

4 голосов
/ 15 апреля 2020

используйте virtual в базовом классе, чтобы пометить базовый метод как переопределяемый:

public virtual IEnumerator MyStartCoroutine()
{
    Debug.Log("no coroutine started");
    yield return new WaitForSeconds(1);
}

и используйте override вместо new в производном методе, чтобы указать переопределение базового метода :

public override IEnumerator MyStartCoroutine()
{
    return base.MyStartCoroutine();
}

new создает «новый» метод, который не зависит от методов базового класса. override указывает среде выполнения использовать производный метод, а не базовый метод.

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