我遇到了泛型和新成员的问题。我编写了一个对 ObjectA 类型的对象进行操作的泛型类。 ObjectB 派生自ObjectA,并隐藏了ObjectA 的一些成员。当我提供 ObjectB 的类型作为泛型类的类型参数时,我希望当我调用 ObjectB 隐藏的任何成员时,我将调用 ObjectB 的实现。但是,CLR 仍然调用隐藏成员(ObjectA 的实现)。这似乎不合逻辑,因为我明确地将 ObjectB 的类型提供给泛型类。这是泛型本身的问题,还是我做错了什么?
编辑:不幸的是,我无权访问 ObjectA 的源代码,并且我想要覆盖的成员不是虚拟的。如果我有权访问 ObjectA 的源代码,我会将成员设为虚拟,但由于我无法这样做,因此“覆盖”成员的唯一选择是通过“new”关键字。
class GenericClass<T> where T : ObjectA
{
public void DoWork(T item)
{
// When type parameter 'T' is ObjectB, should get ObjectB's implementation
item.Invoke();
}
}
class ObjectA
{
public void Invoke()
{
// A's implementation...
}
}
class ObjectB : ObjectA
{
public new void Invoke()
{
// B's implementation...
}
}
static void Main()
{
GenericClass<ObjectB> genericClass = new GenericClass<ObjectB>();
ObjectB objectB = new ObjectB();
genericClass.DoWork(objectB);
}
否。编译器生成的调用是针对成员的它在编译时知道。这是被曝光的成员ObjectA
.
您不使用虚拟/重写方法的正常继承有什么原因吗?
顺便说一下,这是同一类事情的另一个例子 - 没有使用字符串的重载 == 运算符,即使T
is 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));
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)