簡體   English   中英

清單<BaseClass>並訪問孩子的變量

[英]List of <BaseClass> and accessing childs variables

我正在創建一個對話系統,我想使用多態來使工作更容易,所以我有一個類,即包含 List dialog_tree 的對話樹......然后我有 TextBoxNPC、TextBoxText、TextBoxItem 等,所以我可以讓每個頁面顯示如果我願意,可以使用不同類型的對話框。 每個 TextBox 都包含它是什么類型的文本框的枚舉,當我想更改不在基類中的變量時就會出現問題。

public class Dialogue_Tree
{

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

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

如果在 textboxnpc 我有 Sprite npc_portrait 我不能改變它,因為它被視為文本框。 所以即使我投了它,我也會得到一個空異常,無論如何要這樣做嗎?

我唯一的其他選擇是只有一個類 TextBox 並且它具有每種不同類型對話所需的每個變量,但是每個文本框頁面有 35 個未使用的變量,這似乎是在浪費資源。

你對多態性的理解是顛倒的。 如果您有一個使用此多態的繪圖程序:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM