gpt4 book ai didi

.net - 泛型:访问新成员,而不是隐藏成员

转载 作者:行者123 更新时间:2023-12-05 09:25:34 25 4
gpt4 key购买 nike

我遇到了泛型和新成员的问题。我写了一个泛型类,它对 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 公开的成员。

您有什么理由不使用普通继承,使用虚拟/重写方法?

顺便说一句,这里是同类事物的另一个示例 - 未使用字符串的重载 == 运算符,即使 Tstring调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com