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

2024-03-03

我遇到了泛型和新成员的问题。我编写了一个对 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(使用前将#替换为@)

泛型:访问新成员,而不是隐藏成员 的相关文章

  • 何时使用 IComparable 与何时使用IComparer

    我正在尝试找出我需要实现哪些接口 他们本质上都做同样的事情 我什么时候会使用其中一种而不是另一种 好吧 他们不是quite与IComparer
  • 依赖注入的惰性解析

    我有 net 课程 我使用 Unity 作为 IOC 来解决我们的依赖关系 它尝试在开始时加载所有依赖项 Unity中有没有一种方法 设置 允许在运行时加载依赖项 还有更好的解决方案 Unity 2 0 中对 Lazy 和 IEnumera
  • Java 泛型 - 重写抽象方法并具有子类的返回类型

    我正在尝试创建一个设置 其中一组子类覆盖超类 这个超类包含一个抽象方法 理想情况下 其返回类型是调用该方法的对象的返回类型 这样它的有效行为如下 public abstract class SuperClass public abstrac
  • web.config 转换为

    我有针对多个环境的 web config 转换 在配置文件中 我有一个 applicationSettings 部分 其中包含多个设置和值对 我尝试过根据用于匹配名称的语法并更改连接字符串以匹配设置并更改值 但转换失败 这是可能吗 所以我的
  • StreamReader 消耗的字节数

    有没有办法知道 StreamReader 使用了流的多少字节 我有一个项目 我们需要读取一个文件 该文件具有文本标题 后跟二进制数据的开头 我最初尝试读取该文件是这样的 private int dataOffset void ReadHea
  • 查询 dns 别名

    我找到了一些code http msdn microsoft com en us library system net dns gethostbyaddress VS 71 aspx来自 msdn 站点 下面包含代码 看起来它将返回给定服务
  • EF数据库首先如何针对数据库更改更新模型?

    在班级图书馆Ado net Entity Data Model已生成 POCO 类 这些是第一次生成的 但数据库更改并未得到反映 在edmx图表右键单击并选择Update Model from Database显示新创建的表 但即使选择添加
  • 将 C# 字符串传递给非托管 C++ DLL

    我有一个简单的应用程序 它加载一个非托管 dll 并从 C 向它传递一些字符串值 但在 C dll 应用程序中 我收到异常 试图访问读 写保护的内存 我的 DLL 导入如下所示 DllImport X dll CallingConventi
  • 如何将字符串解析为 UNIQUEIDENTIFIER?

    我正在编写一个实体框架 LINQ 查询 其中我想将字符串解析为 UNIQUEIDENTIFIER 又名 GUID 作为WHERE clause public IEnumerable
  • 标签中的路径显示

    NET 中有没有自动修剪路径字符串的方法 例如 C Documents and Settings nick My Documents Tests demo data demo data emx becomes C Documents dem
  • 对 URL 进行编码 C#

    所以我有一个看起来像这样的 URL http www test com folder1 id 3 但基本上 当他们单击按钮时 我想在 URL 栏中显示与该 id 关联的值的名称 例如 id 3 是名为 Rollex 的手表 所以我想要读取
  • 列出运行时从开放泛型类型创建的封闭类型

    当我列出当前 AppDomain 中的所有类型时 我会看到带有通用占位符的通用类型 但是 如果我使用类型实例化泛型类型 然后列出 appDomain 中的所有类型 则我看不到新创建的封闭类型 在下面的示例中 输出仅为 Foo 1 T 我正在
  • 从同步上下文调用异步方法

    我在代码中通过 HTTP 调用服务 最终使用 HttpClient SendAsync 方法 然后从 WebAPI 控制器操作调用此代码 大多数情况下 它工作得很好 测试通过 但是当我在 IIS 上部署时 我遇到了死锁 因为异步方法调用的调
  • 如何使用 .NET 4 运行时运行 PowerShell?

    我正在更新管理一些 NET 程序集的 PowerShell 脚本 该脚本是为针对 NET 2 与 PowerShell 运行的框架版本相同 构建的程序集编写的 但现在需要使用 NET 4 程序集以及 NET 2 程序集 由于 NET 4 支
  • 从标签 ID 更改整个 gridview 单元格颜色

    试图弄清楚当我有标签 ID 时如何更改 gridview 单元格的背景颜色
  • .NET Core == .NET Framework 5 吗?

    我一直在寻找书籍来研究最新的 NET Framework 据我所知 NET 最高为 4 6 但 ASP NET 最高为 5 核心 NET Core 是 NET 5 的名称还是我们目前仍使用 NET 4 6 去引用斯科特 汉塞尔曼 http
  • C# 要么返回 false 要么什么也不做

    我想知道是否有办法不必重复相同的事情如果施工而是调用一个状态检查 成功后无法返回true 有人知道这个问题更好的标题吗 bool Enable if GetStatus ref status Trace WriteLine Error re
  • 这个 SQL 查询有什么问题?

    在过去的一个小时里 我一直在尝试此查询的不同变体 但我在用户名处收到错误 并且用户名只是一个普通字符串 其中的用户名是我从不包含特殊字符或任何内容的 xml 文件中获取的 我正在使用 SLQ 紧凑型 3 5 P S 我尝试使用 而不是 us
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • 类似于 .NET Framework 2.0 的 MEF(托管可扩展性框架)

    我在自己的项目中使用了 MEF 并且非常喜欢它 这很容易 在弄清楚我们的awkwardAPI模型 它刚刚工作了 现在我需要 NET Framework 2 0 类似的东西 有没有可以在 NET Framework 2 0 下工作的类似项目

随机推荐

  • Compose LazyColumn 选择一项

    我想选择 LazyColumn 的一项并更改文本颜色 如何识别选择了哪个项目 Code val items listOf Pair A 1 Pair AA 144 Pair BA 99 var selectedItem by mutable
  • 如何将 { 和 } 放入格式字符串中[重复]

    这个问题在这里已经有答案了 我试图在运行时生成一些代码 在其中放入一些样板内容 并允许用户输入实际的工作代码 我的样板代码看起来像这样 using System public class ClassName public double Th
  • 为什么有人声称 Java 的泛型实现很糟糕?

    我偶尔听说 Java 在泛型方面做得不太好 最近的参考 here https stackoverflow com questions 457822 what are the things java got right 请原谅我的经验不足 但
  • 具有动态范围和 customOrder excel 的排序宏

    我正在尝试制作一个多级排序宏 而行数是动态的 我一直在摆弄一些测试数据来尝试让它工作 但是我不断从 Excel 中收到 1004 运行时错误 希望第二双眼睛能帮助解决这个问题 这是测试数据 A B C D Num Status Junk J
  • 检查接收者是否拿起电话

    在 Android 中 我需要确定接听电话是否已接听 这似乎不可能 因为 TelephonyManager 不提供该状态 其他人建议查看通话记录列表并检查最后呼叫号码的持续时间 这不太好 因为最后拨打的号码可能是几小时或几天前 还有其他建议
  • 禁用 Webpack 的捆绑

    我想使用 webpack 作为 typescript 构建工具 这样每个 typescript 文件都会被翻译成 1 个 js 文件 webpack 指南有这样的配置 module exports entry app tsx module
  • 带有动画 GIF 的 TGIFImage - 事件不起作用 - 如何检测动画进度?

    德尔福的TGIFImage有以下事件 OnPaint OnAfterPaint OnLoop OnEndPaint 但在显示动画 GIF 时 这些事件都不会被调用 我使用以下代码来显示动画 GIF FGif Image1 Picture G
  • 什么是白名单和黑名单数据?

    我正在阅读有关 XPCOM 组件开发的内容 我遇到了这些称为白名单数据和黑名单数据的术语 我试图在谷歌上查找 但无法找到 我不知道它与编程有何关系 所以如果我把问题放在错误的地方 请原谅我 白名单和黑名单是过滤数据的两种方式 如果您有白名单
  • 回调与 lambda

    假设我有以下代码想要重构 int toFuture precalc int calc 5 foobar x 3 postcalc return calc int toPast precalc int calc 5 foobar y 9 po
  • WPF 4.5 父子行为是否发生了变化:我们现在可以毫无例外地向另一个父级添加一个子级?

    在 Net 4 0 中 以下代码抛出InvalidOperationException与消息 指定的元素已经是另一个元素的逻辑子元素 首先断开它 var parent new System Windows Controls ContentC
  • .gitlab-ci.yml 错误:“apk:找不到命令”

    我有以下内容 gitlab ci yml file image docker services docker dind stages test build deploy test stage test before script apk a
  • 在这种情况下溢出意味着什么?

    我找到了一种以模数相乘的算法 下一个伪代码取自维基百科 页面模指数 部分从右到左的二进制方法 完整的伪代码是 function modular pow base exponent modulus Assert modulus 1 modul
  • Vuetify 没有 vue-cli sass/scss 冲突

    我需要将 vuetify 集成到一个无法使用 vue cli 且具有以下 css sass webpack 配置的项目中 test s ac ss use MiniCssExtractPlugin loader loader css loa
  • 在 C# if 语句中检查多个布尔条件的最佳方法

    我的代码 C 中有 3 个布尔值和一个int32取决于布尔值的属性true and false 除了 if 语句之外 以另一种方式实现此目的的最佳方法是什么 if a b c d 1 if a b c d 2 etc ect 编辑 这 3
  • 在 Spring Data JPA 中使用 Java 配置进行审计

    Java 配置是Spring Data 1 2 0 版本中引入 http blog springsource org 2012 10 15 spring data release train arrived 但我不知道java配置如何
  • Windows 上的“catalina.out”在哪里?

    我在 Linux 机器上有一个 tomcat 我可以可视化 catalina out 文件 我想将我的开发环境 Eclipse IDE JDK 6 Tomcat 6 等 从 Linux 迁移到 Windows 一切正常 但是 我在 Wind
  • 我可以使用 JavaScript 或 HTML 打开 IE 10 兼容性视图吗?

    如何在 Javascript 或 HTML 中以编程方式打开 IE 10 兼容性视图 我刚刚在其中添加了以下元标记标签 但它不起作用 有没有办法在 JS 中做同样的事情 我查了msdn上的兼容模式文章 here http msdn micr
  • Excel 中的动态数据验证(非 VBA!)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 I got n持有的类别m产品 该列表未排序 例如如下 现在这就是我基本上想用这个列表做的事情 下拉菜单 数据验证 动态存储第一列的每个唯一值的列表
  • Scala String 与 java.lang.String - 类型推断

    在 REPL 中 我定义了一个函数 请注意返回类型 scala gt def next i List String i map 0 i reverse map 1 next i List String List java lang Stri
  • 泛型:访问新成员,而不是隐藏成员

    我遇到了泛型和新成员的问题 我编写了一个对 ObjectA 类型的对象进行操作的泛型类 ObjectB 派生自ObjectA 并隐藏了ObjectA 的一些成员 当我提供 ObjectB 的类型作为泛型类的类型参数时 我希望当我调用 Obj