在 C# 中,如果一个类或方法没有标记为 seal 或 virtual,那它是什么?

2023-12-20

换句话说,默认值是什么(如果没有指定)?我猜默认是虚拟的,因为即使基本方法没有指定虚拟,您也可以使用“new”关键字来覆盖基本方法。如果是这样的话,那么为什么我们还需要虚拟选项呢?当我们确实需要防止进一步继承时,我们难道不能只使用 Sealed 吗?


C# 方法默认是密封的——如果没有virtual关键词。

The new关键词hides基类中的方法。

这就是我所说的隐藏的意思:

public class HidingA
{
    public string Get()
    {
        return "A";
    }
}

public class HidingB : HidingA
{
    public new string Get()
    {
        return "B";
    }
}

HidingA a = new HidingA();
HidingB b = new HidingB();

Console.WriteLine(a.Get()); // "A"
Console.WriteLine(b.Get()); // "B"

HidingA c = new HidingB();
Console.WriteLine(c.Get()); // "A". Since we're calling this instance of "B" an "A",    
                            //we're using the "A" implementation.

现在,虚拟版本!

public class VirtualA
{
    public virtual string Get()
    {
        return "A";
    }
}

public class VirtualB : VirtualA
{
    public override string Get()
    {
        return "B";
    }
}
VirtualA a = new VirtualA();
VirtualB b = new VirtualB();

Console.WriteLine(a.Get()); // "A"
Console.WriteLine(b.Get()); // "B"

VirtualA c = new VirtualB();
Console.WriteLine(c.Get()); // "B". We overrode VirtualB.Get, so it's using the 
                            // "B" implementation of the method

所以如果我们创建一个方法HidingA作为参数并传递给它一个实例HidingB,我们将得到HidingA的实施Get method.

MSDN: http://msdn.microsoft.com/en-us/library/6fawty39.aspx http://msdn.microsoft.com/en-us/library/6fawty39.aspx

类对于继承是开放的,除非sealed指定了关键字。

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

在 C# 中,如果一个类或方法没有标记为 seal 或 virtual,那它是什么? 的相关文章

  • 按成员序列化

    我已经实现了template
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 作业 - 尝试计算两个城市之间的多个航班停靠点?

    这是针对数据库类 使用 Oracle DB 11g Tables Flight flt no from city to city flt distance flt departs flt arrives flt price Aircraft
  • Delphi XE2无限等待线程中调用哪个等待方法

    如果我有一个 While not terminated do begin doStuff end 在 Delphi XE2 线程的执行方法中循环 我不想让它让我所有的失败 我该怎么称呼 在 Delphi 7 中 这很简单 我调用 Sleep
  • 如何在 Perl 中从终端进行管道传输而不丢失颜色?

    我正在尝试编写一个 perl 脚本 它获取 colorgcc 的输出 或任何其他将彩色文本打印到终端的脚本 添加 删除字符串的一部分 然后将结果打印在same颜色作为输入字符串 以下代码将在生成的每一行前面打印 Hello World 颜色
  • iOS itunesconnect 沙箱测试账户(无效年份)

    这太奇怪了 上周我创建了一个测试用户帐户 一切都很好 但今天 它要求我添加出生年份 正如您在下面的屏幕截图中看到的那样 没有年份字段要填写 它却要求填写 苹果 你是认真的吗 如果我做错了什么 请告诉我 UPDATE 看来这是苹果页面上的一个
  • 如果未实现功能,则在链接时启用错误

    我注意到 当使用 G 链接项目时 如果有已声明但未实现的函数 则不会出现错误 除非我尝试调用它们 Q1 如果声明了函数但未实现 是否可以启用错误 或至少警告 Q2 为什么会有这种行为 Note 我在用G 4 7 0 ld 2 22如果那是
  • 标题中的离子导航选项卡

    嘿 我有一个关于离子导航的问题 我的应用程序的主要导航位于页脚中 但我想在标题中添加一个信息选项卡 我也希望此选项卡有它自己的视图 所以我将其设置如下所示
  • 更改所有页面的背景颜色 WP7

    有没有办法改变所有页面的背景颜色 或者我只需要改变LayoutRoot每页上的颜色 您可以做的是创建一个应用背景颜色的样式 您仍然需要将该样式应用到每个页面 但之后如果您需要进行更多更改 则只需更改样式即可 应用于页面的示例样式可以在以下位
  • 如何将 matplotlib 图保存为 .png 文件

    我有一段代码是从工作中的合作者那里获得的 这段代码生成如下图所示的图 绘图的示例图像 https i stack imgur com oJJLZ png 它通过引用另一段代码中的另一个函数来实现这一点 我不想以任何方式改变这一点 我想做的是
  • PHP 会话固定/劫持

    我正在尝试更多地了解 PHP会话固定 https www owasp org index php Session fixation以及劫持以及如何预防这些问题 我在 Chris Shiflett 的网站上阅读了以下两篇文章 会话固定 htt
  • 在 Eclipse IDE 中调试 Java 时将异常捕获为表达式

    Java 开发人员的日常调试情况是抛出异常 然后您需要深入调试器以找出抛出异常的原因 通常 您会尝试在引发异常之前设置一些断点 并希望能够确定导致该异常的情况 在 Eclipse 中 断点可以定义一个表达式 仅当变量 x 等于值 y 时才会
  • 您的 Xcode 版本对于您的 iOS 版本来说可能太旧

    我已将手机的操作系统版本更新至 iOS 14 并于今天将 Xcode 更新至版本 12 但是当我尝试通过 Android Studio 在 iPhone 11 iOS 14 上构建 Flutter 应用程序时 出现以下错误 Your Xco
  • 如何访问 Wasm (Rust) 中的 JS 对象属性?

    我正在使用 wasm bindgen 并且有以下功能 wasm bindgen pub fn obj o JsValue console log 1 o 在js中我调用这个函数obj name john 它工作得很好 但是当我尝试时cons
  • MS Access 找不到项目或库错误

    我正在开发一个专为我使用而构建的访问数据库 我熟悉编写 VBA 代码来执行功能 但是 我根本不熟悉调试某些错误 数据库中有一个表单 允许我清理和操作我可以从计算机中选择的文件中的数据 它使用一个文件夹作为主根来查看我向表单提供该文件夹中文件
  • 如何让 Spotlight 更容易找到自定义 iOS 应用

    我在我的设备上编写了很多小测试应用程序 我可以将一些元数据添加到应用程序中 以便它更容易出现在 Spotlight 搜索中吗 例如 我制作了一个名为 Lavado 的洗衣计时器应用程序 当我搜索 计时器 或 洗衣房 时 可以使其出现在 Sp
  • 导入函数中的 __globals__ 与主模块中函数的 __globals__ 有很大不同

    File a py def f pass File main py import a print f globals print a f globals def g pass print g globals print g globals
  • VB.NET 中的控件数组

    如何在 VB NET 中制作按钮的控件数组 就像在 Visual Basic 6 0 中一样 语法有可能像下面这样吗 dim a as button for each a as button in myForm a text hello n
  • 如何将 JOptionPane 转换为 JDialog

    我需要将 JOptionPane 转换为 JDialog 因为我需要摆脱那个古怪的 确定 按钮 下面是代码 JOptionPane showMessageDialog null Interface caption JOptionPane W
  • 列出字典中以<用户输入>开头的所有单词

    如何编写一个程序 让用户输入一个字符串 然后该程序生成一个以该字符串开头的单词列表 Ex 用户 和 方案 退位 收腹 绑架 Thanks 编辑 我正在使用 python 但我认为这是一个相当独立于语言的问题 Use a trie http
  • 在 C++ 中将枚举值映射到字符串

    有没有办法在运行时将枚举的值映射到名称 我正在与 GCC 一起构建 我知道 GDB 可以做到这一点 并且我愿意使用一些不可移植且会破坏调试数据的东西 Edit 我正在寻找一种解决方案 不需要修改原始枚举声明 也不需要手动复制映射函数中的所有
  • 在 C# 中,如果一个类或方法没有标记为 seal 或 virtual,那它是什么?

    换句话说 默认值是什么 如果没有指定 我猜默认是虚拟的 因为即使基本方法没有指定虚拟 您也可以使用 new 关键字来覆盖基本方法 如果是这样的话 那么为什么我们还需要虚拟选项呢 当我们确实需要防止进一步继承时 我们难道不能只使用 Seale