【问题标题】:List of <BaseClass> and accessing childs variables<BaseClass> 列表和访问子变量
【发布时间】:2020-03-16 18:16:58
【问题描述】:

我正在创建一个对话系统,我想使用多态性来简化工作,所以我有一个类,它是包含 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。 所以即使我投了它,我也会得到一个空异常,无论如何要这样做吗?

我唯一的其他选择是只有一个类 TextBox 并且它具有每种不同类型的对话所需的每个变量,但是每个文本框页面都有 35 个未使用的变量,这似乎是一种资源浪费。

【问题讨论】:

    标签: c# list variables polymorphism parent-child


    【解决方案1】:

    您对多态性的理解是颠倒的。如果你有一个使用这种多态的绘图程序:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多