多态性和接口 - 澄清?

2023-12-06

(迂腐的问题)

根据维基百科多态性有 3 种类型:

  • 特设多态性

指的是可以应用于参数的多态函数 不同的类型,但根据类型的不同,其行为也不同 它们所适用的论点

换句话说:重载:

function Add( x, y : Integer ) : Integer;
...
function Add( s, t : String ) : String;
  • 参数多态性

允许通用地编写函数或数据类型,以便它 可以相同地处理值,而不依赖于它们的类型

换句话说:泛型

例子 :

class List<T> {
    class Node<T> { ...
  • 亚型多态性

允许编写一个函数来获取某种类型 T 的对象, 但如果传递一个属于 S 类型的对象也能正常工作 这是T的一个亚型

(最常见的用法)

例子 :

abstract class Animal {
    abstract String talk();
}

class Cat extends Animal {
    String talk() {
        return "Meow!";
    }
}
...

另一个例子 :

class Animal
{
    public virtual void eat()
    {
        Console.Write("Animal eating");
    }
}
class Dog : Animal
{
    public override void eat()
    {
        Console.Write("Dog eating");
    }
}

Great .

现在我想向您展示接口的定义:

接口- 一个接口定义了一个contract可以通过以下方式实现 类和结构。接口可以包含方法、属性、 事件和索引器。接口不提供以下实现 它定义的成员——它仅仅指定必须是的成员 由实现接口的类或结构提供。

Great.

问题:

看这个伪代码:

Dog implements IWalk {...}
Cat implements IWalk {...}
Array[IWalk] = [new Dog(),new Cat()]
foreach item in array :  item.walk();
  • 这是多态行为吗(对每个不同的对象调用 walk())?

恕我直言,事实并非如此。为什么 ?因为它不对应于上面提到的任何 wiki 类别。

我相信这是纯粹的编码原则,我通过不同的眼镜来看待一个对象——而不是像上面提到的 3 个范例那样创建/改变功能

我对吗 ?这是否是多态行为?


我认为你走在正确的道路上。接口本身不是多态的。他们将多态性形式化。它们允许您以声明方式而不是实现方式定义多态行为。我喜欢将 Interfaces 视为俱乐部中的保镖。他们只是确保每个人都遵循多态规则。

在您的示例中,实际的多态行为与接口本身无关,而是与共享的方法相关。 walk 方法适合子类型多态性示例。界面本身只是按照契约要求子对象必须行走。

UPDATE:

基于评论:只是为了弄清楚 - 通过它实现的不同接口查看对象 - 也是多态行为吗?

界面本身只是一个合同(您在问题中钉住了它)。多态性来自于合约上的方法。 “多态类型是一种其操作也可以应用于其他某种或多种类型的值的类型”(来自维基百科)。接口(契约)是保存服务或使用方法(条款)的协议。因此,每个合约都包含多态行为的条款。

Dog implements IWalk, ITalk, IAnimal
{
    //concrete implementation
}

IWalk 
{
    void walk();
}

ITalk
{
    String talk();
}

IAnimal
{

}

我对java很生疏,所以如果它的语法不正确,请考虑这个伪代码。

在这种情况下,IAnimal 只是一个不包含多态行为的合约。 IWalk 和ITalk 提倡多态性。

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

多态性和接口 - 澄清? 的相关文章

  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • Apache 重写没有 mod_rewrite?

    在没有启用或配置 mod rewrite 的情况下 Apache 如何重写 URL 我正在从我的开发服务器重新设计网站 我在网站部分使用目录结构 但我正在考虑切换到 URL 重写并将相关文件放在网站的根目录中 例如 about 页面有一个名
  • git 从 Linux 克隆到 TFS git 存储库

    我一直在尝试解决托管在本地 TFS2017 上的 Git 存储库的问题 无法从不在域中的 Linux 计算机上执行 git clone 命令 继续获取 致命 身份验证失败 我使用的用户是Linux机器上的本地用户 与域用户同名 密码相同 用
  • Android Volley POST 参数

    我需要调用一个需要字符串数组作为 POST 参数的 api 例如 API 定义 POST api names 预期的 POST 参数是一个名称数组和一些其他属性 如下所示 names John Bill department Enginee
  • Mongodb 在带有正则表达式查询的数组字段上不同?

    基本上我正在尝试在模型上实现标签功能 gt db event distinct tags bar foo foobar 进行简单的不同查询会检索所有不同的标签 但是 我将如何获取与某个查询匹配的所有不同标签 举例来说 我想获得所有匹配的标签
  • Android:尝试在运行时更改 TextView 的宽度

    我有一个文本视图 我试图在运行时更改其大小 但尺寸不变 xml文件中的代码
  • 我可以将图像表单数据传递给 PHP 函数进行上传吗?

    我正在尝试使用 jquery 和 PHP 上传图像 如下所示 HTML
  • 为什么“ps”中没有出现“echo”?

    我很难理解 ps 命令上显示的内容 为了测试我的理解 我创建了下面的虚拟脚本 bin bash for i in 1 100000 do date u date u date u done 运行此脚本时 我打开了一个新终端并重复执行 ps
  • Ajax 响应:[readyState:0,responseText:“”,状态:0,statusText:“错误”]

    我的 ajax 调用导致错误 这是我可以在错误回调中获得的信息 readyState 0 responseText status 0 statusText error 这意味着什么 我究竟做错了什么 这是我的 ajax 调用 var aja
  • 使用where条件创建唯一索引

    现在我有下面的用户表 并且希望电子邮件列在 id 有前缀时唯一auth0 column id text email text not null 所以我尝试了这个CREATE UNIQUE INDEX陈述 CREATE UNIQUE INDE
  • 如何使图像适合框架,保持纵横比并在缩略图列表中居中

    我想将列表缩略图框显示为数据网格 每个缩略图必须放置在具有特定宽度和高度的框架中 为了一致性 如下所示 div class frame img src img1 jpg div div class frame img src img2 jp
  • PHP 中如何将数组元素转换为字符串?

    如果我有一个包含对象的数组 a array objA objB 每个对象都有一个 toString method 如何将所有数组元素转换为字符串 以便数组 a除了它们的字符串表示之外不再包含任何对象 是否有单行或我必须手动循环数组 一行 a
  • Golang 写入输入并从终端进程获取输出

    我有一个关于如何从终端子进程 例如 ssh 发送输入和接收输出的问题 python 中的一个例子是这样的 如何为子进程提供密码并同时获取标准输出 我在 Golang 中找不到与上述工作方式类似的简单示例 在 Golang 中 我想做这样的事
  • Delphi 10.3.3 未能通过 macOS 公证

    我的程序在Delphi 10 3 2中经过公证 但在10 3 3中失败 PAClient 退出并显示代码 1 是否有日志可以帮助我诊断问题 如果是这样 我该如何找到它 这是之后的整个错误 Connecting to 192 168 1 23
  • 为什么 int[] 上的 Arrays.asList 返回 List,而不是 List

    考虑这段代码 int tcc 1 2 3 ArrayList
  • Javascript 设置打印样式表

    如何修改打印样式表对象的样式 我正在使用 jQuery 如果这有帮助的话 我基本上想设置一个对象的 css 属性 但该属性仅适用于打印 而不适用于屏幕 例如 myobject css background white print 这个问题有
  • 如何使用timeit模块

    我该如何使用timeit比较我自己的功能的性能 例如 insertion sort and tim sort 如果你想使用timeit在交互式 Python 会话中 有两个方便的选项 Use the IPython壳 其特点是方便 time
  • 从轮廓中删除图例

    这是从R获得的图片 代码如下 我想将其导出为 PDF 格式 不过 我想首先删除右侧的图例栏 据我所知 没有可选参数来控制这个条形图例 你会怎么做 library gplots f lt function x y theta num lt x
  • SimpleDateFormat 抛出 ParseException 错误偏移量为 0

    下面的代码有什么问题 它抛出一个 ParseException 错误偏移量为 0 final DateFormat df new SimpleDateFormat EEE MMM dd HH mm ss yyyy df parse Thu
  • PrimeFaces p:editor 基于什么?

    我想向 PrimeFaces 添加一些客户端功能p editor 但由于某种原因 我无法发现他们用来构建组件的 JavaScript 客户端代码 有人能指点我吗 附 我想做的两件事是使组件可调整大小 PrimeFaces 不支持 并且我想添
  • 多态性和接口 - 澄清?

    迂腐的问题 根据维基百科多态性有 3 种类型 特设多态性 指的是可以应用于参数的多态函数 不同的类型 但根据类型的不同 其行为也不同 它们所适用的论点 换句话说 重载 function Add x y Integer Integer fun