[英]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.