我遇到了泛型和新成员的问题.我写了一个泛型类,它对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);
}
Run Code Online (Sandbox Code Playgroud)
否.编译器生成的调用是在编译时知道的成员.这是被公开的成员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));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
354 次 |
| 最近记录: |