解決策を提供することだけに集中します。代わりに、DieGameAction に IList < object > を使用させることができます。
class DieGameAction : IGameAction {
IList<object> gameObjectList;
public DieGameAction(IList<object> objectList) {
gameObjectList = objectList;
}
}
次に、任意の IList < T > に適応する IList < object > 実装を提供できます。
public abstract class IGroup<T> : IEnumerable where T : class {
protected List<T> groupMembers;
protected List<IGameAction> groupIGameActionList;
public IGroup() {
groupMembers = new List<T>();
groupIGameActionList = new List<IGameAction>();
groupIGameActionList.Add(new DieGameAction(new ObjectListAdapter<T>(groupMembers)));
}
}
IList < T > をラップすることもできる System.Collections.ObjectModel.Collection < T > をベースとして使用して、多くの可能なソリューションの 1 つを提供しようとしています。
public class ObjectListAdapter<T> : System.Collections.ObjectModel.Collection<T>, IList<object>
{
public ObjectListAdapter(IList<T> wrappedList)
: base(wrappedList)
{
}
public int IndexOf(object item)
{
return base.IndexOf((T)item);
}
public void Insert(int index, object item)
{
base.Insert(index, (T)item);
}
public new object this[int index]
{
get
{
return base[index];
}
set
{
base[index] = (T)value;
}
}
public void Add(object item)
{
base.Add((T)item);
}
public bool Contains(object item)
{
return base.Contains((T)item);
}
public void CopyTo(object[] array, int arrayIndex)
{
this.Cast<object>().ToArray().CopyTo(array, arrayIndex);
}
public bool IsReadOnly
{
get { return false; }
}
public bool Remove(object item)
{
return base.Remove((T)item);
}
public new IEnumerator<object> GetEnumerator()
{
return this.Cast<object>().GetEnumerator();
}
}
リストの変更により、サポートされていないオブジェクトを使用しようとすると、ここでプログラムした方法で型キャスト例外がスローされますが、好きなように処理することもできます。
ここで、 IList < object > については、代わりに List < T > によって実装されている IList を使用することもできるため、これを機能させるために基本的に何もする必要はありません。
重要なことは、基本的に同じ基になる List オブジェクトを使用するため、使用される両方の場所でリストが同じように表示されることに注意してください。
これがあなたの質問に答えているかどうか、回答としてマークするか、控えないでください:)