我正在编写一个带有类型参数T的通用抽象类A,我打算用类B派生它。
A有一个数据成员mX,它是类C的实例,并具有一个泛型函数。这个泛型函数GetAllOfType()有一个类型参数T,该类型参数被限制为第三个类D。GetAllOfType()搜索一组包括了D的派生类实例的D实例容器,返回其中属于类型T的子集合(因此对D进行了约束)。
D类本身没有特定的数据成员int mY,但是一些派生类D(如E和F)有。
问题在于 GetAllOfType() 受限,并且由于未对 A 类进行限制而导致错误。
我尝试将 A 进行如下约束:
但我也遇到了一个类似的错误:
类类型约束“F”必须列在任何其他约束之前。考虑将类型约束移动到约束列表的开头。
我尝试过交换它们:
同样,结果是相同的错误,但将E替换为F。
我所尝试的是否可能?我做错了什么?
同样,我不能更改类C、D、E和F中的任何内容。
A有一个数据成员mX,它是类C的实例,并具有一个泛型函数。这个泛型函数GetAllOfType()有一个类型参数T,该类型参数被限制为第三个类D。GetAllOfType()搜索一组包括了D的派生类实例的D实例容器,返回其中属于类型T的子集合(因此对D进行了约束)。
D类本身没有特定的数据成员int mY,但是一些派生类D(如E和F)有。
public class D
{
}
public class E : D
{
public int mY;
}
public class F : D
{
public int mY;
}
public class C
{
public T[] GetAllOfType<T>() where T : D
{ ... }
}
public class A<T>
{
private C mX;
...
}
public class B : A<E>
{
...
}
以下是我的问题:
B类继承并实现A类时使用的参数类型是D的派生类。我试图在A类中编写一个函数Foo,该函数通过GetAllOfType()枚举并访问类型为E、F或任何具有mY成员的其他成员的mY成员。
public class A<T>
{
private C mX;
protected Foo()
{
foreach (var c in mX.GetAllOfType<T>())
{
c.mY = 0;
}
}
}
public class B : A<E>
{
public Bar()
{
Foo();
}
}
问题在于 GetAllOfType() 受限,并且由于未对 A 类进行限制而导致错误。
我尝试将 A 进行如下约束:
public class A<T> where T : D
但是我遇到了编译时错误,大致如下:
类型
T
不包含定义为mY
的内容,并且找不到类型T
的扩展方法mY
(是否缺少 using 指令或程序集引用?)
我还尝试了对多个派生类进行约束:
public class A<T> where T : E, F
但我也遇到了一个类似的错误:
类类型约束“F”必须列在任何其他约束之前。考虑将类型约束移动到约束列表的开头。
我尝试过交换它们:
public class A<T> where T : F, E
同样,结果是相同的错误,但将E替换为F。
我所尝试的是否可能?我做错了什么?
同样,我不能更改类C、D、E和F中的任何内容。
foreach (T c in mX.GetAllOfType<T>())
吗?在这种情况下,你需要将成员变量mY
移动到你的D
基类中。对于public class A <T> where T:E,F
,代码期望T
实现了E
和F
,如果我没有弄错的话。 - John Kalbererint mY
添加到class D
中,因为所有派生类都有它? - John Alexiou