问问题
645 次
4 回答
2
你可以尝试这样的事情:
public abstract class Foo<T>
{
List<T> _List = new List<T>();
public List<T> ListObject { get { return _List; } }
}
public class Bar : Foo<string>
{
public List<string> ListString
{
get { return ListObject; }
}
}
结果:
于 2013-03-24T22:56:43.320 回答
2
我希望其他人会对此提出一个相当好的答案,但现实情况是这个问题可能没有一个好的答案。
然而,有几种方法可以给普通猫剥皮,其中许多方法非常难看。
这个问题的一个丑陋的解决方案是实现一个列表类,它封装 n 个List<object>
对象并尝试以您选择的任何类型访问这些对象。这种类型的代理类可能很难正确处理,但可能是一种做你想做的事情的方法。
public class StringObjectList : IList<string>
{
private List<object> _list;
public StringObjectList(List<object> src)
{
_list = src;
}
// IList Implementation...
public string this[int index]
{
get
{
object obj = _list[index];
if (obj == null)
return null;
return obj.ToString();
}
set
{
_list[index] = value;
}
}
// ... plus 3 more IList<string> methods (IndexOf, Insert, RemoveAt)
// ICollection<string> implementation (5 methods, 2 properties)
// IEnumerable<string> implementation (1 method)
// IEnumerable implementation (1 method)
}
一些实现细节有点棘手。大多数情况下,尽管实现是简单的代理方法,因为底层列表很乐意接受字符串以及任何其他对象。例如,该ICollection<string>.Add
方法可以很简单:
public void Add(string item)
{
_list.Add(item);
}
您可能遇到的问题是IEnumerable<string>
和IEnumerable
实现,这可能需要您创建几个支持类。
不简单,不优雅,但可能可行。
于 2013-03-27T03:09:35.797 回答
0
如果您不喜欢上面的通用解决方案,您可以使List
成员抽象。
public abstract class Foo
{
public abstract IList ListObject { get; }
}
public class Bar : Foo
{
public override IList ListObject
{
get { return new List<string>(); }
}
}
于 2013-03-24T23:04:37.753 回答
0
public abstract class Foo<T>
{
public abstract IList<T> MyList { get; }
// you can manipulate MyList in this class even if it is defined in inherited class
}
public class Bar : Foo<string>
{
private readonly IList<string> _myList = new List<string>();
public override IList<string> MyList
{
get { return _myList; }
}
}
[TestFixture]
public class TestFixture1
{
[Test]
public void Test()
{
Bar oBar = new Bar();
Foo<string> oFoo = oBar;
oFoo.MyList.Add("Item");
// oFoo.ListObject= { "Item" }
// oBar.ListString = { "Item" }
oBar.MyList.Add("NewItem");
// oFoo.ListObject= { "Item" }
// oBar.ListString = { "Item" }
}
}
于 2013-03-24T23:22:51.960 回答