如何检测c#中的虚拟方法是否被重写[重复]

2024-03-13

是否可以确定虚拟方法是否已被重写:

class ABase {

  public void DoSomething(object p)
  {
    p.Process();
    if( /* DoSomethingExtra is implemented */ )
      DoSomethingExtra(p);
  }
  public virtual void DoSomethingExtra(object p) { }

}

class ADerived {
  public override void DoSomethingExtra(object p)
  {
    p.ProcessMore();
  }
}

我意识到这个例子看起来很愚蠢(例如,为什么不直接调用 DoSomethingExtra() 因为它没有做任何事情)。我向你保证我有一个合法的理由。有任何想法吗?


因此,在 C# 中,可以声明虚拟方法而不实现它。

这不可能。您可以将方法声明为abstract,但如果该方法是虚拟的,它将有一些实现(即使该实现实际上是一个空操作)。

您上面的代码报告了错误Error 1 'ABase.DoSomethingExtra(object)' must declare a body because it is not marked abstract, extern, or partial.

处理此问题的典型方法是仅声明具有 null 操作实现的方法,然后调用它:

class ABase {
  public void DoSomething(object p)
  {
    p.Process();
    DoSomethingExtra(p); // Always call
  }
  public virtual void DoSomethingExtra(object p)
  {
      // Do nothing here
  }
}

编辑:既然您的问题已被编辑,我将为您提供与您的编辑相关的更多信息,特别是:

我意识到这个例子看起来很愚蠢(例如,为什么不直接调用 DoSomethingExtra() 因为它没有做任何事情)。我向你保证我有一个合法的理由。有任何想法吗?

没有直接的方法可以确定当前实例是否覆盖了您的虚拟方法。这可能需要一些非常讨厌的、难以维护的代码,例如检查方法体通过反射声明类型 https://stackoverflow.com/questions/2932421/detect-if-a-method-was-overridden-using-reflection-c/2932448#2932448看看那里有什么。

话虽这么说,我强烈质疑这里的设计目标。你的问题基本上是在询问一种违反的具体方式里氏替换原则 http://en.wikipedia.org/wiki/Liskov_substitution_principle,这是面向对象编程的核心原则之一。这将会降低你的代码的性能和可维护性......

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

如何检测c#中的虚拟方法是否被重写[重复] 的相关文章

  • 如何将这段 javascript 代码重写为 C++11?

    这是我在 Javascript Definitive Guide 中看到的 javascript 闭包代码 我想把它写成C 11 var uniqueID1 function var id 0 return function return
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • 如何通过覆盖 MSBuild 目标来防止外语资源生成?

    我正在致力于减少大型 C ASP NET 解决方案的编译时间 我们的解决方案使用通常的 resx 文件方法翻译成大约十几种外语 这些资源文件的解析和编译极大地减慢了我们的编译时间 并且是日常的挫败感 我知道可以创建自定义资源提供程序并摆脱
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • 如何从不同的线程访问控件?

    如何从创建控件的线程以外的线程访问控件 避免跨线程错误 这是我的示例代码 private void Form1 Load object sender EventArgs e Thread t new Thread foo t Start p
  • std::make_pair 与浮点数组(float2,无符号整数)

    我有一个用 float2 unsigned int 对模板化的向量 例如 std vector
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和

随机推荐

  • C# 快速/高效地压缩大量数据块

    我有大约 270k 个数据块对 每对由一个 32KiB 和一个 16KiB 块组成 当我将它们保存到一个文件时 我当然会得到一个非常大的文件 但数据很容易被压缩 用WinRAR对5 48GiB的文件进行强压缩后 得到的文件大小为37 4Mi
  • 如何在不破坏标签的情况下截断html?

    如何确保所有 html 标签都已关闭 出现问题是因为我想为每篇文章创建某种摘录 例如有人写了这样一篇文章 Hi everyone I m just an article and I have few strong tags strong i
  • MYSQL Docker 容器给出“未知数据库”错误

    我正在使用带有 docker compose 的 MySQL docker 容器 效果很好 唯一的问题是我收到错误unknown database database name 我每天第一次运行它 Windows启动后 之后 如果我停止它并重
  • IIS 5.1 中的 WCF 作为纯文本文件

    我刚刚在我的开发环境中设置了一个简单的 WCF 服务 到目前为止 对于 SOAP 和 JSONP 请求 端点工作正常 我已继续将此解决方案部署到托管在 IIS 5 1 上的临时服务器 我知道 但请耐心等待 并且 svc文件突然不再工作了 并
  • System.Uri 实现 ISerialized,但给出错误? [复制]

    这个问题在这里已经有答案了 可能的重复 如何 xml 序列化 uri https stackoverflow com questions 1036492 how to xml serialize a uri 据我所知Uri实现 ISeria
  • 添加迁移以在实体框架 6 中创建数据库时出错,找不到方法 CoreTypeMappingParameters

    我正在尝试运行添加迁移以在本地计算机上创建数据库 在最后几秒钟我收到此错误 找不到方法 Void CoreTypeMappingParameters ctor System Type Microsoft EntityFrameworkCor
  • IntelliJ IDEA Community Edition 可以以某种方式支持 Ultimate 的功能吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我知道社区版不支持 Ultimate 的某些功能 但我想知道无论如何都没有办法让这些功能运行 例如企业开发 如Tomcat Glassfi
  • 在 Python 中打开 .h5 文件

    我正在尝试用 Python 读取 h5 文件 该文件可以在以下位置找到这个链接 https github com yhilpisch py4fi tree master ipython source它被称为 vstoxx data 3103
  • 如何测量来自客户端的 Websocket 背压或网络缓冲区

    我正在使用 ws Node js 包创建一个到每秒发送数百条消息的服务器的简单 WebSocket 客户端连接 即使使用仅 console logs 传入消息的简单 onMessage 处理程序 客户端也无法跟上 我的理解是 这被称为背压
  • 在 C# 中创建动态扩展方法?

    是否可以解决此错误 public static class LayoutExtensions
  • 通过鼠标悬停定位工具提示

    我正在使用以下链接中找到的代码 https www d3 graph gallery com graph heatmap tooltip html https www d3 graph gallery com graph heatmap t
  • TemplateHaskell 和 IO

    如果 TH 的功能有副作用 是否有任何适当的方法可以确保它们的安全 比如说 我想要一个在编译时调用 git 并生成版本字符串的函数 LANGUAGE TemplateHaskell module Qq where import System
  • 在导航 goBack 上发送道具

    基本上我有三个屏幕 第一个是堆栈导航器 const stackNav createStackNavigator Main screen MainScreen navigationOptions navigation gt header nu
  • mvc c# jquery 如果记录存在则更新视图的一部分,否则更新表

    我正在寻求有关如何实现此功能的建议 像往常一样 我有一个带有编辑框的页面 用户在其中提交带有输入的页面 其唯一目的是将其保存到记录中 但是我想要做的 为了避免重复 是首先在表中搜索任何相似的记录 如果有任何相似的记录 我想将其返回给用户 在
  • MVVM 实现的问题:对所选项目的更改传播到列表,不希望这样

    所以我遇到了这个问题 希望你能帮忙解决 我正在使用 MVVM Light 作为框架编写 WPF 应用程序 在这种情况下 我有一个项目列表 并且 SelectedItem 绑定到用户可以在其中编辑项目的详细信息视图 在本例中 有一个 保存 按
  • jQuery 模糊事件未触发

    我是 jQuery 新手 所以我打赌我做错了什么 但我不明白为什么这个事件没有触发 我有一个 textarea 元素 由于正在接受数据的应用程序 需要在提交之前删除所有分隔符 我试图在文本区域失去焦点时进行清理 因此采用模糊方法 不幸的是
  • 读取 csv 时区错误

    经过几个小时的谷歌搜索后 我没有找到解决这个问题的方法 基本上当我跑步时read csv some file csv 函数来自readr包我收到以下错误 错误 未知 TZ UTC 并且 csv 未被读取 我读取 CSV 的唯一方法是这样 r
  • Django 管理员:有条件地设置 list_display

    是否有任何管理模型方法 如 get list display 或某种方式 我可以有一些条件来设置不同的 list display 值 class FooAdmin model ModelAdmin def get list display
  • 如何重置ReactJS文件输入

    我有文件上传输入
  • 如何检测c#中的虚拟方法是否被重写[重复]

    这个问题在这里已经有答案了 是否可以确定虚拟方法是否已被重写 class ABase public void DoSomething object p p Process if DoSomethingExtra is implemented