Список <BaseClass>и доступ к дочерним переменным - PullRequest
0 голосов
/ 16 марта 2020

Я создаю диалоговую систему, и я хочу использовать полиморфизм, чтобы упростить работу, поэтому у меня есть класс, который является деревом диалогов, в котором содержится List dialog_tree ... и затем у меня есть TextBoxNP C, TextBoxText, TextBoxItem et c чтобы на каждой странице отображалось диалоговое окно другого типа, если я того пожелаю. каждый TextBox содержит перечисление типа текстового поля, и проблема возникает, когда я хочу изменить переменные, которых нет в базовом классе.

public class Dialogue_Tree
{

    List<TextBox> dialogues = new List<TextBox>();

    public Dialogue_Tree()
    {
        dialogues.Add(new TextBoxNPC());
        dialogues[0].
    }
}

если в textboxnp c у меня есть Sprite npc_portrait Я не могу изменить его, потому что он рассматривается как TextBox. так что даже если я приведу его, я получу нулевое исключение, есть ли в любом случае это сделать?

моя единственная другая опция будет иметь только один класс TextBox и иметь каждую переменную, необходимую для каждого другого типа диалога, но то есть 35 неиспользуемых переменных на страницу текстового поля, которые кажутся пустой тратой ресурсов.

1 Ответ

1 голос
/ 16 марта 2020

У вас есть понимание полиморфизма с ног на голову. Если бы у вас была программа для рисования, которая использовала этот полиморф c:

abstract class Shape {
  public int X = 0;
  public int Y = 0;
}

class Rectangle:Shape {
  public int Width = 10;
  public int Height = 20;
}

class Circle:Shape {
  public int Diameter = 50;
}

В родительском классе вы бы не смотрели на тип потомка и делали что-то другое:

foreach(Shape s in _listOfShapes){
  if(s is Circle c)
    myCanvas.DrawCircle(c.X,c.Y,c.Diameter);
  else if(s is Rectangle r)
    myCanvas.DrawRectangle(c.X,c.Y,r.Width,r.Height);
}

Вы создаете способ обрабатывать все фигуры одинаково:

abstract class Shape {
  public int X = 0;
  public int Y = 0;
  abstract void DrawYourself(Canvas c)
}

class Rectangle:Shape {
  public int Width = 10;
  public int Height = 20;
  override DrawYourself(Canvas c){
    c.DrawRectangle(base.X,base.Y,this.Width,this.Height);
  }
}

class Circle:Shape {
  public int Diameter = 50;
  override DrawYourself(Canvas c){
    c.DrawCircle(base.X,base.Y,this.Diameter);
  }
}

Теперь все фигуры знают, как рисовать себя на холсте (которым владеет родитель), вы относитесь ко всем как простые старые формы:

foreach(Shape s in _listOfShapes){
  s.DrawYourself(myCanvas);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...