1

我想解释一下这个问题的标题。

我有基类

 public class BaseClass { /* stuff */ }

和其他两个继承的类BaseClass

  public class Test1: BaseClass {  ... }

  public class Test2: BaseClass { ... }

好的,然后假设使用泛型类(在我的项目中它非常复杂)

  public GenericClass<T> : IBase<T> where T: BaseClass, Test1, Test2

有时我只需要以BaseClass其他方式使用Test1Test2.

我有一个功能:

  public int Create ( T obj){
    if( obj is Test1) { return aManager.Create((Test1)obj); } // the cast is OK
    else if(obj is Test2) { return bManager.Create((Test2)obj);}  // error cast
  }

我也aManager.Create (Test1 obj)bManager.Create(Test2 obj)

为什么else在行中我的演员阵容有误?

我的错误在哪里?

PS:如果我在和之间更改顺序Test1Test2那么首先if会出现转换错误,然后else就可以了。

4

2 回答 2

0

就 theTest1Test2are 类而言,这条线是不正确的。

public GenericClass<T> : IBase<T> where T: BaseClass, Test1, Test2

因为在泛型类型约束中只允许一个基类并且它必须作为第一个约束,但是您可以将多个接口类型作为约束。看到这个

要了解我的意思,Create像这样更改方法,您将看到错误:

public int Create ( T obj)
{
//if( obj is Test1) { return aManager.Create((Test1)obj); } // the cast is OK
//else if(obj is Test2) { return bManager.Create((Test2)obj);}  // error cast
    return 1;
}
于 2013-03-29T08:01:13.360 回答
0

我认为您误解了泛型类型约束的工作原理。让我首先回答你的问题。

你实际上只需要这样的签名。

public GenericClass<T> : IBase<T> where T: BaseClass

这意味着,类型 T 是派生自类型 BaseClass 或 BaseClass 本身的任何类型。

它将很好地接受 BaseClass、Test1 和 Test2 类型的任何实例。

此外,我想建议对您的代码进行改进..

public int Create ( T obj){
    if( obj is Test1) { return aManager.Create(obj as Test1); } // the cast is OK
    else if(obj is Test2) { return bManager.Create(obj as Test2);}  // error cast
  }

However, I believe that the design of your code has some loop holes. If you could explain your context in more detail, you might get better design solutions for your problem. Since I believe this is more to do with the design than the generics as it seems you're using the wrong tool for the job.

于 2013-03-29T11:32:07.527 回答