我遇到了泛型和新成员的问题。我写了一个泛型类,它对 ObjectA 类型的对象进行操作。 ObjectB 派生自 ObjectA 并隐藏了 ObjectA 的一些成员。当我将 ObjectB 的类型作为类型参数提供给泛型类时,我希望当我调用任何被 ObjectB 隐藏的成员时,我将调用 ObjectB 的实现。然而,CLR 仍然调用隐藏成员(ObjectA 的实现)。这似乎不合逻辑,因为我明确地向泛型类提供了 ObjectB 的类型。这是泛型本身的问题,还是我做错了什么?
编辑:不幸的是,我无权访问 ObjectA 的源代码,而且我要覆盖的成员不是虚拟成员。如果我可以访问 ObjectA 的源代码,我会将成员设为虚拟成员,但由于我无法这样做,因此“覆盖”成员的唯一选择是通过“new”关键字。
class GenericClass 其中 T : ObjectA
{
公共(public)无效 DoWork(T 项目)
{
//当类型参数 'T' 为 ObjectB 时,应该获取 ObjectB 的实现
item.Invoke();
}
}
对象A类
{
公共(public)无效调用()
{
//A 的实现...
}
}
对象B类:对象A
{
公共(public)新无效调用()
{
//B 的实现...
}
}
静态无效主要()
{
GenericClass genericClass = new GenericClass();
ObjectB objectB = new ObjectB();
genericClass.DoWork(objectB);
}
最佳答案
没有。编译器生成的调用是针对它在编译时知道的成员。这是由 ObjectA
公开的成员。
您有什么理由不使用普通继承,使用虚拟/重写方法?
顺便说一句,这里是同类事物的另一个示例 - 未使用字符串的重载 == 运算符,即使 T
是 string
调用 Foo
:
using System;
class Test
{
static bool Foo<T>(T first, T second)
where T : class
{
return first == second;
}
static void Main()
{
string x = "hello";
string y = new string(x.ToCharArray());
Console.WriteLine(Foo(x, y));
}
}
关于.net - 泛型:访问新成员,而不是隐藏成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/774726/