接口与抽象类(一般面向对象)

2024-01-10

我最近接受了两次电话采访,被问到接口和抽象类之间的区别。我已经把我能想到的各个方面都解释了,但他们似乎在等我说一些具体的东西,而我也不知道那是什么。

根据我的经验,我认为以下内容是正确的。如果我遗漏了一个要点,请告诉我。

界面:

接口中声明的每个方法都必须在子类中实现。 接口中只能存在事件、委托、属性 (C#) 和方法。一个类可以实现多个接口。

抽象类:

只有抽象方法必须由子类实现。抽象类可以有普通方法和实现。除了事件、委托、属性和方法之外,抽象类还可以具有类变量。由于C#中不存在多重继承,一个类只能实现一个抽象类。

  1. 毕竟,面试官提出了这样的问题:“如果你有一个只有抽象方法的抽象类怎么办?这与接口有什么不同?”我不知道答案,但我认为这就是上面提到的继承吧?

  2. 另一位面试官问我:“如果接口中有一个公共变量,这与抽象类中有什么不同?”我坚持认为接口中不能有公共变量。我不知道他想听什么,但他也不满意。

See Also:

  • 何时使用接口而不是抽象类,反之亦然 https://stackoverflow.com/questions/479142/when-to-use-an-interface-instead-of-an-abstract-class-and-vice-versa

  • 接口与抽象类 https://stackoverflow.com/questions/747517/interfaces-vs-abstract-classes

  • 您如何决定使用抽象类和接口? https://stackoverflow.com/questions/558164/how-do-you-decide-between-using-an-abstract-class-and-an-interface-closed

  • 接口和抽象类有什么区别? https://stackoverflow.com/questions/1913098/what-is-the-difference-between-an-interface-and-abstract-class?rq=1


打个比方:当我在空军时,我参加了飞行员培训并成为一名 USAF(美国空军)飞行员。那时我没有资格驾驶任何东西,必须参加飞机型号培训。获得资格后,我成为一名飞行员(抽象类)和 C-141 飞行员(具体类)。在我的一项任务中,我被赋予了一项额外职责:安全官。现在我仍然是一名飞行员和 C-141 飞行员,但我还履行安全官职责(可以说,我实施了 ISafetyOfficer)。飞行员不需要成为安全官员,其他人也可以这样做。

所有美国空军飞行员都必须遵守某些空军范围内的规定,所有 C-141(或 F-16 或 T-38)飞行员“都是”美国空军飞行员。任何人都可以成为安全员。所以,总结一下:

  • Pilot:抽象类
  • C-141 飞行员:具体级别
  • I安全官:界面

添加注释:这是一个帮助解释概念的类比,而不是编码建议。看看下面的各种评论,讨论很有趣。

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

接口与抽象类(一般面向对象) 的相关文章

  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 接口中的构造方法

    接口中的构造方法不好吗 为什么人们认为有人想要实例化接口 我们想要做的是强制实现者实现构造函数 就像其他接口方法一样 接口就像一个合同 假设我有一个接口 Queue 并且我想确保实现者创建一个带有一个参数的构造函数 该构造函数创建一个单例队
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 防止在派生类中调用基类实现的接口方法 C#

    是否可以在基类中实现接口并允许在第一个派生类级别调用 覆盖已实现的方法 但阻止从任何进一步的派生类调用它 public interface IInterfaceSample bool Test public class Base IInte
  • 是否可以使用打字稿映射类型来创建接口的非函数属性类型?

    所以我正在研究 Typescript 的映射类型 是否可以创建一个接口来包装另一种类型 从而从原始类型中删除函数 例如 interface Person name string age number speak void type Data
  • 接口中“不能降低继承方法的可见性”的含义

    我有两个文件 public interface PrintService void print PrintDetails details class PrintDetails private String printTemplate pub
  • Python - 测试抽象基类

    我正在寻找测试抽象基类中定义的方法的方法 最佳实践 我能直接想到的一件事是对基类的所有具体子类执行测试 但有时这似乎有些过分 考虑这个例子 import abc class Abstract object metaclass abc ABC
  • 为什么不直接使用 DateTime.Now 呢?

    最近一直在努力学习接口方面的知识 我看到了这段代码 但无法理解为什么你不直接使用DateTime Now在其自己的 我不确定为什么这个界面很有用 有人可以解释一下吗 这本书的作者试图解释 但我不太明白如何按照他们所说的方式实现它 程序员是否
  • 具体实现是否应该提供其实现的接口中不存在的任何公共 API?

    接口代码 被认为是很好的实践 这样的代码很容易进行单元测试并实现松散耦合 用户只知道接口 并且连接具体对象的责任位于最顶层 这可以在某些初始化代码中或在帮助下完成 框架 我的问题是关于遵循以下做法代码到接口 这是否意味着具体类永远不能声明其
  • scala:抽象类实例化?

    我怎么会实例化一个抽象类呢 abstract class A val a Int val a new A val a 3 或者是隐式创建了一些具体的类 那些大括号之后是做什么用的new A mean 这样 您就隐式扩展了A 你所做的是语法糖
  • 多个 WCF 服务实现相同的服务契约接口

    多个wcf服务是否可以实现同一个服务契约接口 我想要做的是允许测试服务与真实服务互换 并指定在配置文件中使用哪个服务 例如 ServiceContract public interface IUselessService Operation
  • 委托和接口如何互换使用?

    我可以使用接口方法代替委托吗 如何 我发现搜索接口方法比使用委托更快 我希望有一个简单的代码片段 理论上 可以通过包含单个方法的接口 例如 Java 没有委托 来完成委托完成的所有工作 然而 它使代码变得更加冗长并且没有带来什么好处 话又说
  • 从关系数据库中“区分”对象

    我们的 win32 应用程序根据 MySQL 关系数据库中多个表中的数据组装对象 对于这样的对象 多个修订版本存储在数据库中 当存储某些内容的多个修订版本时 迟早您会问自己这样的问题 您是否可以想象两个修订版本之间的差异 所以我的问题是 比
  • 拦截对对象属性的 __getitem__ 调用

    问题 我怎样才能拦截 getitem 调用对象属性 解释 所以 场景如下 我有一个对象将类似字典的对象存储为属性 每次 getitem 该属性的方法被调用 我想拦截该调用并根据键对获取的项目进行一些特殊处理 我想要的看起来像这样 class
  • 单一职责原则的实施

    如果我将我的对象分解为 单一职责 是否有一个基本的想法 类似的对象应该一起生活还是分开生活 例如 如果我有 class Employee DataProvider IEmployee DataProvider class Employee
  • 如何在应用程序目录层次结构中构建接口?

    将它们全部放在一个单独的文件夹结构中还是与实现它们的类一起放置 切勿将接口与实现它们的类放在一起 除非这些类满足以下要求 这样做将引入一个紧耦合在接口和实现者之间 如果不同时引用实现者 您将无法创建该接口的其他实现 你基本上有两个选择 将接
  • 更改代码使用指针实现多对多关系

    我在 Movie hpp 中有以下代码 ifndef MOVIE H define MOVIE H class Movie private std string title public std string getTitle const
  • 如果您不在 Java 中进行克隆,那么您会做什么以及如何称呼它?

    有没有人对 Java 中的复制构造函数 工厂方法等有任何建议或已建立的最佳实践和命名约定 特别是 假设我有一堂课Thing我想要一个返回新值的方法Thing与 a 具有相同的值Thing传入 如果是实例方法 则作为实例 您会将其作为构造函数
  • 但是创建静态实用方法不应该被过度使用吗?如何避免呢? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着时间的推移 java项目中引入了许多实用方法来完成更复杂和简单的任务 当使用静态方法时 我们在代码中引入了紧密耦合 这使得我们的代

随机推荐

  • 是否可以在 Mirror API 中注册顶级意图?

    例如 顶级操作 是 Google 拍照 等 是否可以使用 Mirror API 来注册自定义顶级事件 好吧 格拉斯 咬碎我吧 我的第二个问题是是否可以获取用户语音 使用 OK Glass Google 示例 用户说出 Google 接受并执
  • Postgresql中按窗口函数结果过滤

    好吧 最初这只是我们和朋友开的一个玩笑 但后来变成了有趣的技术问题 我有以下内容stuff table CREATE TABLE stuff id serial PRIMARY KEY volume integer NOT NULL DEF
  • 无法访问 kubernetes + rancher 中的 KubeAPI 端口

    我有以下配置来启动 rke 当我向上rke 我得到了错误 rancher cluster yml nodes address 192 168 88 246 internal address 172 17 0 1 user dockeruse
  • 如何在android应用程序中使用现有的.so文件[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找应该在 android 平台中将 doc docx 转换为 pdf 的库 我得到了 PdFTron android sdk 因为
  • 如何在 Java Flight Recorder 采样中包含 IO 绑定方法?

    我在启动时通过为测试中的 Java 程序指定以下 CLI 选项来启动 JFR Xmx24g XX UnlockCommercialFeatures XX FlightRecorder XX FlightRecorderOptions def
  • Asp.Net 何时删除过期的缓存项?

    当您添加一个项目到System Web Caching Cache具有绝对到期日期 如下面的示例所示 Asp Net 的行为如何 可以 只需将项目标记为过期 然后执行CacheItemRemovedCallback下次访问尝试时 从缓存中删
  • 如何根据用户请求安全地停止正在运行的线程?

    我所处的场景是 当线程根据 GUI 上的用户操作运行时 我必须终止该线程 我在 Windows 上使用 Qt 4 5 2 一种方法如下 class MyThread public QThread QMutex mutex bool stop
  • 如何查找android中特定进程使用的内存?

    我正在努力寻找解决方案来查找android中特定进程使用的内存 Using actvityManager getRunningAppProcesses 我可以获得所有进程内存使用情况的综合列表 但我需要实现一个场景 我应该通过process
  • Devise - Omniauth – 如果用户通过 Facebook 登录,则隐藏密码字段

    将 Devise 与 Omniauth 结合使用 我成功地允许用户使用他们的 Facebook 帐户登录 在 Omniauth 的帮助下wiki https github com plataformatec devise wiki How
  • 去除img边框

    我的 img 边框有问题 我对所有图像使用以下代码 但边框并没有消失 有人能告诉我删除 img 边框的正确方法吗 div class mosaic overlay img class cover1 div cover1 width 300p
  • 如何将行内的容器拉伸到最大可用高度?

    我有一个 Row 小部件 其中有许多容器 其高度取决于其内容 我希望它们的高度相同 如何在不硬编码其值的情况下实现这一目标 This is something I have 但我希望第一张卡自动获取行的高度 这样两张卡的高度就相同 我怎样才
  • 在 ExpandableListView 上滚动时,选择复选框会重复

    我有一个 BaseExpandableListAdapter 下面的代码 它操纵 ExpandableListView 和一个名为 Checklist 的模型 检查表模型包含一个类别列表 类别是检查列表 支票是低点清单 Low 包含一个布尔
  • 在 ubuntu 上安装 sbt [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经在 Ubuntu 上安装了 sbt bin sbt bin ls classes sbt sbt launch jar target
  • 'pow' 未在此范围内声明

    include
  • C# 添加或读取 C# exe 文件

    是否可以从另一个 C 项目 Windows 窗体 打开 C exe 文件 控制台应用程序 并从 exe 文件写入或读取不同的文本值 我正在使用 user32dll 来处理 exe 文件 谢谢 我确实使用此方法在 exe 文件中添加文本 Cl
  • 当 x 轴值为日期时,注释绘图很困难

    这是我的数据框 gt s Date Average Treatment SE 1 2014 10 15 4 875 1 1 6304852 2 2014 11 12 6 250 1 0 9955257 3 2014 12 11 0 250
  • 如何在 Bootstrap 3 Carousel 中输出当前幻灯片编号?

    我希望使用 Bootstrap 3 的 Carousel 插件输出当前幻灯片编号 理想情况下 我希望将其作为轮播 div 下方的文本 例如 此处轮播 3 of 9 我可以使用 CMS 中的函数输出图像总数 例如上例中的 9 个 但我不知道如
  • C# 获取句柄列表,AcessViolationException

    Info Net 4 5 测试于 Win7 64位 Win10 64位 虚拟盒 我正在尝试获取外部进程的句柄列表并将它们的名称作为字符串返回 以便我可以在之后关闭特定的进程 因此我使用 Win32API 编写了这个函数 它将检查句柄是否是我
  • AM_LDFLAGS 和 LDFLAGS 有什么区别

    我想知道 AM LDFLAGS 和 LDFLAGS 之间有什么区别 因为我遇到了错误 error AM LDFLAGS must be set with before using 当我在 foreach 循环中使用 AM LDFLAGS 时
  • 接口与抽象类(一般面向对象)

    我最近接受了两次电话采访 被问到接口和抽象类之间的区别 我已经把我能想到的各个方面都解释了 但他们似乎在等我说一些具体的东西 而我也不知道那是什么 根据我的经验 我认为以下内容是正确的 如果我遗漏了一个要点 请告诉我 界面 接口中声明的每个