自动使基构造函数在派生类中可用?

2024-01-09

我有一个带有两个构造函数的基类,需要一个参数:

public abstract class StoreBase 
{
    private readonly SomeObject_sobj;

    protected StoreBase(SomeObject sobj)
    {
        _sobj = sobj;
    }

    protected StoreBase(OtherObject oobj)
    {
        _sobj = new SomeObject(oobj);
    }
}

然后我有一个派生类:

public class MyDerived: StoreBase
{

}

这会导致编译错误,如下所示base class doesn't contain parameterless constructor.

我的理解是,因为 MyDerived 不包含构造函数,所以编译器添加了一个无参数构造函数(这是众所周知的,与派生类无关)。但是,由于它派生自另一个类,因此需要首先运行基类构造函数,并且无法确定应从空的 MyDerived 构造函数运行哪个构造函数。

基本上我在问:如果我真的不需要额外的构造函数逻辑,我可以避免将所有构造函数从 Base 复制/粘贴到派生类中吗?我可以说“从基础中获取所有构造函数”而不将它们全部添加吗?

(是的,我知道我可以/应该将其重构为无参数构造函数和受保护的虚拟 Initialize() 方法。但我仍然想知道我是否可以使用构造函数并仍然避免复制/粘贴)


不 - 您还需要在派生类中实现(适当的)构造函数。

派生类只需要使用基类构造函数之一——因此其中所需的构造函数可能与基类完全不同。它们需要手动实现,即使只是:

public class MyDerived : StoreBase
{
     public MyDerived(SomeObject sobj) : base(sobj) {}
     public MyDerived(OtherObject  oobj) : base(oobj) {}
}

Also:

(是的,我知道我可以/应该将其重构为无参数构造函数和受保护的虚拟 Initialize() 方法。但我仍然想知道我是否可以使用构造函数并仍然避免复制/粘贴)

尽管我看到有人吹捧这一点,但我相信这并不总是一个好的做法。在许多情况下,这实际上是有问题的,因为如果子类重写了受保护的虚拟方法,则您依赖子类来正确调用 Initialize。例如,如果子类这样做,它可能会非常糟糕:

public class MyDerived : StoreBase
{
   // .. other stuff
   protected override void Initialize()
   {
       // Leave out, intentionally or accidentally, the following:
       // base.Initialize(); 
   }
}

实际上,在大多数情况下我都会避免这种情况,并在构造函数中(或在私有的非虚拟初始化方法中)进行初始化。不这样做会破坏您对初始化始终按照您想要的方式进行的任何保证。

构造函数和构造函数链提供相同的功能,但有更好的保证。

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

自动使基构造函数在派生类中可用? 的相关文章

  • 静态成员函数与C语言绑定?

    以下 C 代码可使用 Visual C 和 g 进行编译 struct S static void foo extern C void S foo struct T static void foo extern C void T foo a
  • 无法在更新面板中找到上传的文件

    aspx
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 具有长期运行对象上下文的实体框架

    我对 WinForms 我敢说 WPF 中的 Linq to SQL 的主要烦恼之一是缺乏对长时间运行的数据上下文的支持 请参阅here http blogs msdn com dinesh kulkarni archive 2008 04
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • CMake - 未定义参考

    我正在尝试将 gtest 包含到我的项目中 问题是我在 GTest 中收到未定义的引用错误 我正在尝试在 Gtest 中测试 Node 类 在节点的构造函数中 我使用类记录器 尽管我已将库记录器添加到 gtest target 中 但我仍然
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • 锁定文件的一个块

    我有一个大小为 192k 的文件 我想锁定文件的中间部分 例如 我想用 c 锁定文件的 64k 128k 知道如何锁定文件的那部分吗 你需要使用锁定文件Ex http msdn microsoft com en us library win
  • 表单.位置不起作用

    我之前问过这个问题 以为我已经解决了 但它仍然不起作用 Form Show 稍微移动表单位置 https stackoverflow com questions 1214014 form show moves form position s
  • C# Linq 可以做组合数学吗?

    我有这个数据结构 class Product public string Name get set public int Count get set var list new List
  • Windows Phone HttpClient PostAsync 挂起且无响应

    我在拨打电话时遇到问题HttpClientWP 应用程序的 post 方法 PostAsync总是挂起并且不给出任何响应 当我从 WPF 应用程序中尝试时 相同的代码可以工作 这是我正在做的事情 服务器Web API代码 public cl
  • 一个对大文件有效的轻量级 XML 解析器?

    我需要解析潜在的巨大 XML 文件 所以我猜这排除了 DOM 解析器 是否有任何优秀的 C 轻量级 SAX 解析器 在占用空间上可与 TinyXML 相媲美 XML的结构非常简单 不需要诸如命名空间和DTD之类的高级东西 只是元素 属性和
  • C语言中如何将整数转换为字符? [复制]

    这个问题在这里已经有答案了 C语言中如何将整数转换为字符 C 中的字符已经是数字 字符的 ASCII 代码 无需转换 如果要将数字转换为相应的字符 只需添加 0 即可 c i 0 0 是 ASCii 表中的一个字符
  • C++ std:.auto_ptr 或 std::unique_ptr (支持多个编译器,甚至是旧的 C++03 编译器)?

    我正在尝试更新一些 C 代码 我想转向更现代的代码 c 11 但我仍然需要使用一些较旧的编译器 兼容 c 03 来编译代码 因为支持的平台限制 我知道在 C 11 编译器中 std auto ptr 已被弃用 但由于较旧的编译器支持 我不能
  • C# 编译器编译 .txt .obj .java 文件

    using System class Program public static void Main Console WriteLine Hello World Console ReadLine 我将文件另存为1 java 2 obj an
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu
  • Selenium WebDriver 在按钮单击事件上无法正常工作。这里有什么问题呢?

    I am using following code to scrape data from a website I have following interface 这是 HTML div class es content div

随机推荐

  • Firebase - 在 NestJS 框架中处理云事件

    我在用着NestJS https nestjs com作为我的后端框架和 Firebase 要在 HTTP 请求上将 Nest 与 Firebase 集成起来很简单 只需将 Nest 的 Express 实例附加到 Firebase 即可
  • MIPS 是字节可寻址的

    我一直在观看以下 URL 上解释 MIPS ISA 的讲座 据我目前的理解 对于32位MIP 主存储器有一个32位地址输入总线 存储器中的每个插槽保存8位 因此每个地址可以引用8位存储器 这就是它的字节可寻址的原因 由于寄存器大小是 32
  • jQuery 在 rtl 方向上的scrollLeft - FireFox 和 Chrome 中的不同值

    我有以下简单的HTML div div table tr td T1 td td T2 td td T3 td td T4 td td T5 td td T6 td td T7 td tr table div div br span spa
  • US-ASCII 中的无效字节序列(Ruby 1.9 + Rails 2.3.8 + mongodb + mongo_mapper)

    我的设置是 linux Ruby 1 9 Rails 2 3 8 mongodb mongo mapper 我跟着http railscasts com episodes 194 mongodb and mongomapper http r
  • 使用 Cloud Functions for Firebase 获取匿名用户

    我正在使用 Cloud Functions 来管理项目中的数据库和身份验证 我按照这个例子https github com firebase functions samples tree master delete unused accou
  • 将浮点输入字符串流时出现“浮点无效操作”

    我有一段简单的代码 它从 FORTRAN 生成的 REAL 数组中提取浮点数 然后将其插入流中进行记录 尽管这适用于前 30 个案例 但在第 31 个案例中 它因 浮点无效操作 而崩溃 代码是 int FunctionDeclaration
  • 分配给映射中的匿名结构值

    我正在使用 go 1 3 如何访问映射的匿名结构 ValueType 的字段 package main import fmt type Words map string struct pos int n int func main w ma
  • Liquibase 先决条件不起作用

    我正在尝试使用 liquibase 来跟踪使用 dropwizard migrations 的 postgresql 数据库的更改 我希望能够在现有的生产数据库上运行迁移 而不是从头开始重建 现在我正在分阶段进行测试 我创建了一个带有前提条
  • 根据角度和距离求出Y点

    在我的项目中 我想从 X 点到 Y 点画一条线 虽然我知道 X 点的位置 但我只知道 Y 点的角度和距离 所以我的问题是通过角度 距X点 和距离得到Y点的坐标 我在这个项目中使用 JavaScript 并且不想使用任何图形库 例如 X 点
  • AppEngine/Go:将新版本的 Go 与 SDK 结合使用

    目前 Go SDK 附带的 Go 版本是 1 6 2 但最新版本是 1 7 1 我需要一些自 1 6 2 以来发布的增强功能 错误修复 但是 当我更换goroot在 SDK 目录中包含 Go 1 6 2 且符号链接指向 1 7 1 的目录中
  • 使用 Promise.all 解决获取请求

    我有一个包含 4 个请求对象的数组 我想在它们上使用 Fetch API 并获取承诺 然后我想解决每一个承诺并取回价值 这是我构建请求对象的方法 let requestsArray urlArray map url gt let reque
  • jQuery 动画 - 什么时候是异步的,什么时候不是?

    我有两个要设置动画的 div div div div div 我在 jQuery 中调用 animate 如下所示 sprite animate width 1 400 character animate width 1 400 chara
  • 在 pandas 中使用 groupby 过滤数据

    我有一个 DataFrame 其中包含以下数据 每行代表电视剧每集中出现的一个单词 如果一个单词在一个剧集中出现 3 次 则 pandas 数据框有 3 行 现在我需要过滤一个单词列表 这样我应该只得到出现超过或等于 2 次的单词 我可以通
  • 捕获单个任务中的异常并重新启动它们

    如果我创建一系列asyncio顶级类中的任务 所有这些任务基本上都应该永远运行 如下所示 asyncio create task asyncio create task asyncio create task self event loop
  • UICollectionView 单元格不可见

    我最近在我的故事板中添加了一个 UICollectionView 它目前被另一个视图推入视图 这似乎工作正常 但是 使用故事板编辑器 我将视图设置为包含 35 个单元格 这些单元格在编辑器中看起来很好 但是当我运行应用程序中的单元格是不可见
  • 使用azure数据工厂更新Azure机器学习模型

    当我使用数据工厂更新 Azure ML 模型时 如文档所述 https learn microsoft com en us azure data factory v1 data factory azure ml update resourc
  • 如何使用 C++ 更改/设置 DNS?

    我正在尝试使用 C 更改 设置 DNS 目前我无法找到这方面的任何资源 public static NetworkInterface GetActiveEthernetOrWifiNetworkInterface var Nic Netwo
  • 使用 SQL 编辑 XML 列。不那么结构化的 XML

    这个问题是一个这个问题的后续 https stackoverflow com q 40080985 5089204 如何通过获取 的新标签来编辑 XMLXXX 不是那么结构化的 xml 需要帮助 我对 XML 和 XQuery 非常陌生 如
  • 与 C# 和 VBA 的并行 COM 互操作

    我不是在谈论从 C 调用 VBA COM 相反 我想做的是在 MS Access 中使用 VBA 调用 C 库 而不注册 DLL 我已经玩了一段时间的并行互操作 但没有成功 我终于意识到 mdb manifest 可能不是 exe mani
  • 自动使基构造函数在派生类中可用?

    我有一个带有两个构造函数的基类 需要一个参数 public abstract class StoreBase private readonly SomeObject sobj protected StoreBase SomeObject s