我正在用 C# 编写一个应用程序,并且正在努力解决它的泛型实现。我有一个继承层次结构,它由另一个继承层次结构(模型和视图模型)镜像,如下所示:
class A_Content { }
class B_Content : A_Content
{
public string Bar;
}
class C_Content : A_Content
{
public string Foo;
}
class A { public A_Content content; }
class B : A { }
class C : A { }
public class Test
{
IList<A> A_Collection = new List<A>();
public Test()
{
B b = new B();
C c = new C();
b.content = new B_Content();
c.content = new C_Content();
A_Collection.Add(b);
A_Collection.Add(c);
}
}
这工作得很好,但不会对 强制执行任何类型约束content
,这让我每次想使用它时都将它转换为正确的派生类。我想诱使编译器强制执行 B 对象只有B_Content
内容的约束。我的第一个切入点是:
class A_Content { }
class B_Content : A_Content
{
public string Bar;
}
class C_Content : A_Content
{
public string Foo;
}
class A { }
class B : A { B_Content content; }
class C : A { C_Content content; }
public class Test
{
IList<A> A_Collection = new List<A>();
public Test()
{
B b = new B();
C c = new C();
A_Collection.Add(b);
A_Collection.Add(c);
}
}
content
这很好用,但意味着当我只有一个 s 的集合时,我无法访问公共元素A
。我真正想做的是:
abstract class A_Content { }
class B_Content : A_Content
{
public string Bar;
}
class C_Content : A_Content
{
public string Foo;
}
abstract class A<T> { T content; }
class B : A<B_Content> { }
class C : A<C_Content> { }
public class Test {
IList<A<A_Content>> A_Collection = new List<A<A_Content>>();
public Test()
{
B b = new B();
C c = new C();
A_Collection.Add(b);
A_Collection.Add(c);
}
}
但是,这会产生一个错误,抱怨 B 不能隐式转换为 A。我尝试添加显式强制转换无济于事。有什么方法可以比第二个模型更优雅地表达我正在寻找的约束吗?