继承:内部类与内部接口

2024-01-31

在表达关切的同时防止基类暴露 https://stackoverflow.com/questions/52842532/prevent-exposure-of-base-classes-abstract-classes/52843168#52843168,我了解到(通过测试)public类不能继承自internal班级;然而,一个public类可以继承自internal界面。我真的很好奇为什么这是可能的。我认为这可能是由于以下原因之一(或任意组合)造成的:

  1. 接口仅包含必须实现的签名。
  2. 类可能具有可通过派生类型访问的属性、方法等。
  3. 类可能具有可由派生类型重写的方法。

Case 1

我相信,由于接口只是一个contract包含签名并声明派生类型必须实现这些签名,则允许继承。这是因为接口并不关心谁访问这些签名,只关心派生类型实现它们。


案例2和案例3

Unlike interfaces, 类可以有public可以由派生类型访问的属性。例如:

private class A {
    public int SomeProperty { get; set; } = 0;
}
public class B : A {
    // Some cool code.
}
public class C : B {
    public int MyInt => SomeProperty;
}

此结构具有不一致的可访问性,因为SomeProperty is public并且可以被所有派生类型访问;因此A and B必须具有相同的访问级别以防止暴露。


这就是为什么public类可以派生自internal interface但不是internal class,或者我错过了什么?另外,还有其他原因可以实现这一点吗?


Note

我不是在寻找基于意见的答案;我正在寻找技术上正确的原因来解释为什么这是可能的。

这不是重复的,因为我想知道为什么你不能从一个派生,但你可以从另一个派生。


我认为您缺少的关键概念是继承和接口实现之间的区别。

当一个类继承另一个类时,这意味着它基本上是基类的更具体类型 - 例如,狗是动物的特定类型,因此当您有这样的类时:

class Animal {/* implementation here */}
class Dog : Animal {/* dog implementation here */}

The Dog类已经包含 Animal 的所有实现,除了它的构造函数(静态和实例)和终结器。

然而,当一个类实现一个接口时,就意味着它必须提供该接口的成员(即方法、属性、事件和索引器),所以如果你有一个IAnimal接口和一个Dog直接实现它的类,您的代码如下所示:

interface IAnimal 
{
    void Eat();
}

class Dog : IAnimal 
{
    public void Eat() {/* implementation here */}
}

请注意,所有内容IAnimal声明必须显式或隐式地实现Dog类 - 因此接口提供的契约保留在类中 - 无论类的用户是否知道该接口。

所以总而言之 - 要使用该类,您不需要了解它实现的接口的任何信息,但您确实需要了解该类的所有内容,并且由于狗是动物,如果狗是公共的,那么必须成为动物。
另一方面,IAnimal 接口可以保留在内部。

关于实现内部接口的另一点,已经在 user2864740 对问题的评论中提到 - 由于所有隐式接口实现必须是公共的 - 如果您正在实现内部接口,您应该考虑明确实施 https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation- 这样,实现就保留在内部,并且不会暴露在包含程序集之外。

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

继承:内部类与内部接口 的相关文章

  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • gdb 在 docker 上立即退出“进程已完成,退出代码 1”或 lldb“数据包返回错误 8”。另外:如何在 docker 中允许进行 C++ 调试

    这花了我一整天的时间才找到 所以我将其发布以供将来参考 我正在 docker 镜像上开发 C 我正在使用克利翁 我的代码是在调试模式下编译的 并且在运行模式下运行良好 但是当尝试调试时 进程会立即退出 并显示非常丰富的信息 Process
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • std::bind 重载解析

    下面的代码工作正常 include
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab

随机推荐

  • 使用 SQLite 修复数据路径未找到错误

    我已经让 sqlite 数据库在编辑器中工作得很好 然而 当在 Android 中使用它时 我收到一条错误消息 指出未找到数据路径 我相信我在正确的plugins android 文件夹中拥有所需的 libsqlite so 文件以及编辑器
  • 无法在 Apache Airflow 中设置 DB2/DashDB JDBC 连接

    我正在尝试使用 Airflow UI 创建 DB2 DashDB 连接 我添加了 db2jcc4 jar 驱动程序并提供了路径以及类名 com ibm db2 jcc DB2Driver class 我尝试运行一个简单的查询 在临时 UI
  • 获取页面上特定类型的所有Web控件

    我一直在思考如何获取页面上的所有控件 然后在此相关问题中对它们执行任务 如何以编程方式搜索 C DropDownList https stackoverflow com questions 869122 how to search thro
  • 为什么我的子域重定向到我的主域?

    所以基本上 我有一个子域 m mydomain com au尽管每次我访问它时 我都会被重定向到www mydomain com au m 例如 如果我尝试去m mydomain com au contact php 我会自动重定向到www
  • Python Bottle - 如何在不关闭服务器的情况下上传媒体文件

    我正在使用来自的答案这个问题 https stackoverflow com questions 14296438 bottle file upload and process并看到评论 raw data file read This is
  • UIImage 调整纵横比填充和裁剪

    我有这个代码 我拍摄了一张尺寸为 2448x3264 的照片 我需要调整大小并调整到左上角的屏幕显示 对不起我的英语谢谢 void imagePickerController UIImagePickerController picker d
  • 如何解决“应用程序在使用 Google Play 服务时遇到问题。请重试。”

    我已经用react native做一个项目大约4个月了 现在使用 react native 0 57 4 它由我正在渲染 修改 开发的地图视图组成 react native maps 0 22 1 突然我现在遇到了这个错误 App is h
  • 如何在 python/django 中 fork 一个进程?

    然而 在 django 的上下文中 这更像是一个 Python 常见问题 现在我在 django 中有这个视图 它必须处理大量数据 通常 服务器 使用代理运行的 nginx 和 django 需要几分钟才能完成此操作 有时服务器会超时 我不
  • adb 无法在 Ubuntu 64 上运行 - 找不到命令

    Update 在做了更多实验之后 我必须完全重新表述我的问题 因为我被终端愚弄了 只是我发出来的时候并没有显示错误信息须藤 adb 如果我 cd 进入 ANDOID SDK platform tools 目录并运行 adb I get co
  • CSS - 如何强制元素达到父元素剩余/可用空间的 100%,而不超出它?

    在我看来 这似乎是一个非常业余的问题 但尽管如此 它仍然是一个令人沮丧的异常情况 这实际上是两部分问题的第二部分 第一部分是一个相当常见的部分 涉及让元素拉伸到其父对象的 100 高度 在我的演示中 我有以下 HTML div DIV 1
  • jQuery UI datepicker:配置键盘快捷键

    我用jQuery UI 日期选择器 http jqueryui com demos datepicker 让用户选择一个日期 它有一些快捷键 以便可以使用键盘进行控制 page up down previous next month ctr
  • 动态库映像不包含x86_64、i386架构

    我正在尝试为 iOS 构建动态库 并结合架构 armv7 armv7s arm64 i386 x86 64 Here is my target s Build Settings 如您所见 我已将 x86 64 和 i386 添加到架构 an
  • 在 iPad 上调试 JavaScript 错误

    有什么方法可以调试在 iPad 上运行的 JavaScript 页面吗 转到此位置 并启用调试控制台 iOS6 调试控制台消失了 使用替代方案使其发挥作用 例如 Firebug Lite 看看这里的相关问题 iOS6 删除了 iPad 的控
  • 不存在的模型类的雄辩关系

    我希望在我的应用程序中拥有许多模型 模块 但其中一些模型 模块将被某些客户删除 现在我有这样的关系 public function people return this gt hasMany People model id 当我跑步时 mo
  • Java 虚拟机和交换空间

    感谢这里的任何专家可以就以下 JVM 和交换空间相关查询提供建议 提前致谢 1 当 JVM Java 堆 永久代或本机堆中发生内存不足时 操作系统将使用交换空间 我对吗 或者交换空间用于本机堆中的内存不足 2 我是否正确 本机堆大小在 JV
  • 在 iOS SDK 中使用短信/彩信发送附件

    在 iOS 7 中 支持通过第三方应用程序在短信中添加附件 我想知道 支持哪些类型的文件作为附件 例如 png pdf 等 我可以通过短信 彩信发送 NSData 吗 例如 dat 格式 这些邮件的收件人是否能够使用 iOS 的 打开方式
  • Qt Webkit Bridge:C++ 访问 JavaScript

    我正在使用 QWebView 并调用 setHtml 来显示一些 HTML JavaScript 页面 我使用 QWebFrame evaluateJavaScript 传递数据更新 方法是向其传递包含对 JavaScript 函数 带参数
  • 从文本文件读取 - 批处理

    我有一个文本文件 a txt 你好世界下午好 我编写了一个批处理脚本来逐行读取该文件的内容 FOR F tokens delims x in a txt DO echo x 我得到的输出为 Hello World 由于分隔符 空格 的默认行
  • 在Python中使用字符串调用函数[重复]

    这个问题在这里已经有答案了 前几天在网上搜索 发现一篇关于python字典的有趣文章 这是关于使用字典中的键来调用函数 在那篇文章中 作者定义了一些函数 然后定义了一个字典 其键与函数名完全相同 然后他可以从用户那里获取输入参数并调用相同的
  • 继承:内部类与内部接口

    在表达关切的同时防止基类暴露 https stackoverflow com questions 52842532 prevent exposure of base classes abstract classes 52843168 528