是否可以为不共享基类/接口的多个类定义泛型约束?
对于前。
class A
{
}
class B
{
}
class C
{
void Test<T>(T someObj)
{
...
}
}
我想将A类或B类传递给Test方法,没有别的。
我知道我可以在A或B的基类/接口中放置一个where语句,但我不能在我的情况下为相关类指定基接口/类。
答案 0 :(得分:5)
不,这样做没有意义。它不再是通用的。如果类A
和B
共享属性,方法等,它们应该共享相同的接口或基类。如果没有,它们就不是“相同”,也不能被视为同样的。
猜猜如果您在两个类之一中更改了方法签名会发生什么。突然间,这种方法不再“共享”了。编译器不会尝试确定哪些方法和属性可以被视为共享,而是不支持您请求的功能。
一个选项是使用两个方法(每种类型的一个重载)引入重复代码,当然这很糟糕。最好使用interface
,或者如果它真的不在你手中dynamic
,尽管我尽量减少它的使用。
答案 1 :(得分:1)
在编译时不可能。
如果是,您将如何使用通用参数类型T
?它的行为是A
还是B
?
请考虑以下事项:
class A
{
public void MethodInA();
}
class B
{
public void MethodInB();
}
class C
{
// pseudocode here!
void Test<T>(T someObj) where T : A or B
{
// how it would behave if T is B?
someObj.MethodInA();
// how it would behave if T is A?
someObj.MethodInB();
}
}
而是提取一些基类或接口,这对于A
和B
类都是通用的,并在通用方法约束中使用它。
答案 2 :(得分:1)
如果没有共享,那么:
void Test(A obj) {}
void Test(B obj) {}
是唯一真正的方法。你可以将泛型方法设为私有,并将重载设置为public,并从重载中调用私有方法,如:
private void TestImplementation<T>(T object) { ... }
public void Test(A obj) { this.TestImplementation(obj); }
public void Test(B obj) { this.TestImplementation(obj); }