从另一个对象内部获取一个对象的列表

时间:2018-10-05 01:23:51

标签: c#

这是布局

     House -> HouseDef -> Room -> Door
                            L---> Windows

问题在于,任何类都可能具有或未具有像HouseDefinition这样的列表和嵌套类。关键是应该灵活地处理以下三种情况的类变化: 1. hasList, 2. hasNestedObject,该嵌套对象中包含List 3.既没有列表类也没有嵌套类

示例1是包含窗口列表的Room类 2个类似房屋类的示例 像窗口类一样的3的示例

我有这两个类,我想从另一个类中进行一般访问。我希望能够通过访问作为MyTreeNode中的对象存储的House类来获取House Definition中的Rooms List。我该如何不受类型或多态性的约束,以便将来支持更深层次的层次?

public class House
{
   string name;
   HouseDefinition definition;

   public string Name() { return name; }
   public HouseDefinition Definition {get {return definition;}}


   public House(string name,HouseDefinition definition)
   {
       this.name = name;
       this.definition = definition;
   }
}

public class HouseDefinition
{
    private List<Room> rooms = new List<Room>();
    string type;

    public List<Room> Rooms { get { return rooms; } }
    public Room this[int i] { get { return rooms[i]; } }
    public HouseDefinition(string type)
    {
        DefaultLayout();
        this.type = type;
    }
}

    public class MyTreeNode : TreeNode
    {
        string label;
        IEnumerable items;
        bool hasList;
        object item;

        public string Label { get {return label; } }
        public IEnumerable Items { get { return items;} }
        public object Item { get { return item; } }

        public bool HasList { get { return hasList; } }

        public MyTreeNode(object item)
        {
            this.item = item;
            label = item.ToString();
            hasList = false;
        }
        public MyTreeNode(object item, IEnumerable Items)
        {
            this.item = item;
            label = item.ToString();
            hasList = true;

        }
    }

1 个答案:

答案 0 :(得分:0)

我认为您的班级看起来不错,但是我将删除HouseDefinition,因为这些属性对我来说就像House。如果要练习继承,则可以创建一个IBuilding接口,以强制HouseMansionShack实现GetRooms()或类似的方法。其他几件事:

  • 您的TreeNode类应该像public MyTreeNode(T item)一样使用generic types
  • 您应该签出autoimplemented properties-公共字段会自动创建私有支持字段,因此您无需像此处所做的那样创建私有字段和getter:public object Item { get { return item; } }
  • 使用“对象”类型被认为是不好的做法,因此您应将其转换为上述通用类型

祝您好运,到目前为止您的代码看起来还不错!