3

C# 4.0 .NET 4.5 Silverlight 5 我找不到解决方案似乎很奇怪,所以需要一些帮助。

我有基类 Base 和派生类 Child : Base。我还有一个辅助类,它具有通用类型来执行特定工作的一个 EF 实体 Helper,其中 T:EntityObject。

Child 对特定实体 MyEntity 进行特定工作:EntityObject。

所以我尝试了:

public class Base
{
    protected Helper<EntityObject> helper;
}
public class Child : Base
{
    public Child()
    {
        helper = new Helper<MyEntity>();
    }
}

我希望更多的派生类必须知道更具体的泛型参数,我认为这就是协方差......但这不起作用......

像这样设计课程的“正确”方法是什么?

编辑:对不起,我没有说 100% 清楚为什么我不能达到我所需要的。

一个。使用通用 Base 的解决方案不起作用,因为 Base 的用户不知道 T 类型。想象:

public class User
{
    private Base<T> base; // this will not compile.
    public User(TypeEnum t)
    {
        if(t == TypeEnum.MyEntity) base = new Child();
...

湾。使用接口的解决方案不起作用,因为助手在任何地方都使用 T (这是它的目的吗?)。想象它有方法

public IEnumerable<T> Process(IEnumerable<T> items) { return items; }

我如何在对T一无所知的界面中提出它

4

2 回答 2

5

我想这就是你所追求的:

public class Base<T> where T : EntityObject
{
    protected Helper<T> helper;
}
public class Child : Base<MyEntity>
{
    public Child()
    {
        helper = new Helper<MyEntity>();
    }
}

编辑(响应您的编辑):您可以添加一个Base, 像这样使用:

public class Base
{
    // put anything here that doesn't rely on the type of T
    // if you need things here that would rely on T, use EntityObject and have 
    // your subclasses provide new implementations using the more specific type
}
public class Base<T> : Base where T : EntityObject
{
    protected Helper<T> helper;
}
public class Child : Base<MyEntity>
{
    public Child()
    {
        helper = new Helper<MyEntity>();
    }
}
public class User
{
    private Base myBase;
    public User(TypeEnum t)
    {
        if(t == TypeEnum.MyEntity) myBase = new Child();
        ...
于 2013-05-01T11:51:40.570 回答
4

如果Foo: Bar,那并不意味着Some<Foo>: Some<Bar>。有两种方法可以做你想做的事。首先是使基本类型通用,这样:

Base<T> where T : EntityObject {
    protected Helper<T> helper;
}
Child : Base<MyEntity> {...}

第二种是在基本类型上使用非泛型接口,即有

Base {
    protected IHelper helper;
}
Child : Base {...}

在后一种情况下,Helper<T> : IHelper, 对于一些非泛型IHelper的待定义。

作为旁注,您可能会发现在构造函数中向下传递值比使用protected字段更容易。

于 2013-05-01T11:53:11.857 回答