Наследует от класса, который наследует networkBehviour - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь унаследовать класс, который в NetworkBehaviour, но всякий раз, когда я наследую родительский класс (скрипт) перестают работать.

Я пробовал это:

using UnityEngine;  
using UnityEngine.Networking;   

public class FireFighter : NetworkBehaviour
{
    private void Update()
    {}
    private void Move()
    {}
    private void break()
    {}
} 

public class FireCaptain : FireFighter
{   
    public override void Move ()
    {
        base.Move();
        Debug.Log("The captainMoved.");     
    }
} 

Короче говоря, скрипт FireFighter работает хорошо, но всякий раз, когда я его наследую, он перестает работать.Мне нужно немного помощи здесь.Как я могу наследовать класс, который наследует Networkbehaviour.

1 Ответ

1 голос
/ 08 апреля 2019

Будьте осторожны с именами ваших методов! break является ключевым словом и не должно использоваться в качестве имени метода.


Тогда вы определили

private void Move()

в вашем базовом классе FireFighter

=> в FireCaptain нельзя сделать

public override void Move ()
  1. потому что это не virtual или abstract, поэтому вы не можете использовать override вообще.
  2. , даже если это так, вы не можете изменить область (от private до public) в переопределении.
  3. и поскольку в вашем подклассе private, у вас даже нет доступа к вызову base.Move();, поскольку он может быть вызван только самим реализующим классом.

So

To 2.) & 3.) Если вы хотите, чтобы оно было public в подклассе, оно также должно быть public уже в базовом классе. Или вы можете использовать protected, так что только базовый класс и его наследники имеют доступ.

To 1.) Чтобы иметь возможность переопределить метод в вашем подклассе, он должен быть либо virtual, либо abstract. Так что сделай это

  • virtual, если вы хотите иметь реализацию в базовом классе для определения поведения по умолчанию и сделать его только необязательным для его переопределения Например. как

    // subclasses don't have to implement and override
    // this method but can. Also the base.Move(); is optional
    public virtual void Move()
    {
        Debug.Log("You might want to override this to implement a movement");
    }
    
  • abstract, если вы не хотите иметь реализацию в базовом классе и хотите заставить подклассы реализовать это, например. как

    // subclasses will throw a compiler error if they
    // do not implement this method 
    // (without base.Move(); since hte base has no implementation)
    public abstract void Move();
    
...