基本クラス ("Element") と基本リスト クラス ("Elements") をジェネリック クラスとして作成しました。ジェネリック リスト クラスには、"Element" から派生した "Element" 型のクラスのみを含めることができます。「Element」クラスは「ParentRoot」プロパティを所有する必要があり、これには基本リスト クラス (「Elements」) が含まれている必要があります。
public class Element
{
public Elements<Element> ParentRoot { get; set; }
}
public class Elements<T> : List<T> where T : Element
{
}
ここで、上記のクラスから派生した 2 つのクラスと 2 つのリスト クラスを作成します。しかし、「ParentRoot」プロパティの設定に失敗しています:
public class Ceiling : Element
{
public Ceiling(Ceilings parent)
{
Parent = parent;
ParentRoot = parent;
}
public Ceilings Parent { get; set; }
}
public class Ceilings : Elements<Ceiling>
{
}
public class Wall : Element
{
public Wall(Walls parent)
{
Parent = parent;
ParentRoot = parent;
}
public Walls Parent { get; set; }
}
public class Walls : Elements<Wall>
{
}
次の場所で 2 つのエラーが発生します。
ParentRoot = parent;
タイプ "Ceilings" を "Elements" に暗黙的に変換することはできません タイプ "Walls" を "Elements" に暗黙的に変換することはできません
この問題の解決策はありますか?
助けてくれてありがとう!
編集:
わかりました、もう少し具体的にする必要があります。コードを少し拡張しました。
public class Room
{
public Room(Rooms parent)
{
Parent = parent;
}
public Rooms Parent { get; set; }
}
public class Rooms : List<Room>
{
}
public class Element
{
public Elements<Element> ParentRoot { get; set; }
public Rooms FindRoomsToElement()
{
Rooms rooms = new Rooms();
foreach (Room room in ParentRoot.Parent.Parent)
{
// Do stuff here
// if i rename the "ParentRoot" property to "Parent" and make it "virtual",
// and the other properties overwrite it with the "new" key, then this will
// get a null exception!
// i haven't testet it, but i think abstrakt will bring the same/similar result
// if i make the "ParentRoot" property IEnumerable, then there will no
// ParentRoot.Parent be available
}
return rooms;
}
}
public class Elements<T> : List<T> where T : Element
{
public Elements(Room parent)
{
Parent = parent;
}
public Room Parent { get; set; }
}
public class Ceiling : Element
{
public Ceiling(Ceilings parent)
{
Parent = parent;
//ParentRoot = parent;
}
public Ceilings Parent { get; set; }
}
public class Ceilings : Elements<Ceiling>
{
public Ceilings(Room parent) : base(parent)
{
}
}
public class Wall : Element
{
public Wall(Walls parent)
{
Parent = parent;
//ParentRoot = parent;
}
public Walls Parent { get; set; }
}
public class Walls : Elements<Wall>
{
public Walls(Room parent) : base(parent)
{
}
}
これにより、より正確になることを願っています。