Как программно назначить два разных класса одной переменной? - PullRequest
0 голосов
/ 27 марта 2019

Я создаю игру в Unity, и у меня есть 2 класса, я хочу присвоить этой переменной 2 разных класса в зависимости от логического значения, чтобы позже использовать этот класс, как я хочу, вот код, который у меня есть до сих пордать представление о том, что я ищу, возможно ли это сделать?Спасибо

public GeneticController geneticController;
public GeneticDriver geneticDriver;

public Object Genetic;

void Start() {
    if (RaceSelect.SelectedRace == 2) {
        Genetic = geneticDriver;
    } else {
        Genetic = geneticController;
    }

}

void FixedUpdate() {
    float steer = (float)(Genetic.Steering);
    Steering(steer);     

}


В данный момент просто сказано, что у объекта нет переменной с именем "Steering".Каким должен быть тип Genetic?

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Здесь я предполагаю, что и GeneticController, и GeneticDriver реализуют свойство Steering? Если это так, особенно если они имеют дополнительные общие свойства и методы, то правильным способом реализации этого является рефакторинг классов, чтобы они имели общий интерфейс.

public interface ISteering
{
    float Steering {get; set;}
}
public class GeneticController : ISteering
{
    public float Steering{ get; set; }
}
public class GeneticDriver: ISteering
{
    public float Steering{ get; set; }
}

Там вы можете сделать свою переменную Genetic типом ISteering.

public ISteering Genetic;

Однако, если Steering является единственным общим свойством, я рекомендую вам еще раз взглянуть на свой общий дизайн. Если два класса не имеют общих функций или имеют очень мало общих функций, им, вероятно, не нужно совместно использовать переменную.

0 голосов
/ 27 марта 2019

Вы пытались использовать базовый класс, который является производным от ваших 2 подклассов?

Что-то вроде:

public class BaseClass
{
  public float Steering {get;set;}
}

public class GeneticController : BaseClass
{
}

public class GeneticDriver : BaseClass
{
}

, тогда вы делаете следующее (и вам не нужен бросок):

BaseClass Genetic

void Start()
{
  if (RaceSelect.SelectedRace == 2)
  {
    Genetic = geneticDriver;
  } else
  {
    Genetic = geneticController;
  }
}

void FixedUpdate()
{
  float steer = Genetic.Steering;
  Steering(steer);     
}

Вы также можете установить BaseClass как интерфейс. Это зависит от того, есть ли у вас общие функциональные возможности или нет между вами 2 производными классами.

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