new关键字在c#中隐藏成员的有效应用

2024-01-03

我从版本 1 开始就一直使用 C#,并且从未见过成员隐藏的有价值的用途。你知道吗?


场景#1:

假设您正在设计 .NET 2.0 的运行时库。您现在可以使用仿制药。你有一个界面:

interface IEnumerable 
{
    IEnumerator GetEnumerator();
}

您希望制作一个新界面

interface IEnumerable<T> 
{
    IEnumerator<T> GetEnumerator();
}

您现在有三个选择。

1) 使通用版本与非通用版本无关。

2) 使通用版本扩展非通用版本。现在您有两种方法,它们仅在返回类型上有所不同。将新类型中的 GetEnumerator 名称更改为 GetEnumerator2()。因为那很热。每个人都喜欢好的“2”方法。

3) 使通用版本扩展非通用版本。使新的和改进的方法隐藏现有方法,以便在需要时它就在那里,但默认情况下是隐藏的。

这些都是糟糕的选择。你会选择哪个?我们选择了(3)。幸好这是一个选择;如果不隐藏,这个选项就不可能实现。

现在,你可能会争辩说,这个特殊的隐藏例子“不值得”;如果是这样,你会怎么做?

方法隐藏使得在类型系统改进时可以公开改进的接口,而不会造成破坏。

场景#2:

你在 FrobeCo 工作。您生成一个扩展 Blobber 的 Frobber 类,该类是由 BlobCo 的优秀人员提供给您的。

BlobCo 忽略了在 Blobber 上放置 Frobozzle() 方法,但您的客户喜欢使用 frobozzle frobber,因此您向派生类 Frobber 添加了方法 Frobozzle()。

BlobCo 意识到他们的客户想要 Frobozzle blobber,因此他们向基类 Blobber 添加了一个非虚方法 Frobozzle()。

现在你做什么,FrobCo 员工?

1) 删除 Frobber 上的 Frobozzle 方法,从而破坏依赖您实施的客户。请记住,BlobCo 不知道如何 Frobozzle 一个 Frobber;他们只编写了知道如何 Frobozzle Blobber 的代码。

2) 向 BlobCo 抱怨他们应该将他们的方法设为虚拟。希望他们有一天能为此做点什么。

3)在派生类中隐藏它们的方法。

方法隐藏有助于缓解脆弱的基类问题。

进一步阅读:

http://blogs.msdn.com/ericlippert/archive/2008/05/21/method-hiding-apologia.aspx http://blogs.msdn.com/ericlippert/archive/2008/05/21/method-hiding-apologia.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

new关键字在c#中隐藏成员的有效应用 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐