- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我多次看到这句话,但我不清楚这是什么意思。您何时以及为何要这样做?
我知道接口(interface)的作用,但事实上我对此并不清楚,这让我觉得我错过了正确使用它们的机会。
如果你这样做的话,是不是就是这样:
IInterface classRef = new ObjectWhatever()
您可以使用任何实现IInterface
的类吗?你什么时候需要这样做?我唯一能想到的是,如果您有一个方法,并且您不确定除了实现 IInterface
之外将传递什么对象。我无法想象您需要多久这样做一次。
此外,您如何编写一个接受实现接口(interface)的对象的方法?这可能吗?
最佳答案
对于这个问题,这里有一些精彩的答案,其中涉及到有关接口(interface)、松散耦合代码、控制反转等的各种详细信息。有一些相当令人兴奋的讨论,因此我想借此机会进行一些分解,以了解界面为何有用。
当我第一次开始接触界面时,我也对它们的相关性感到困惑。我不明白你为什么需要它们。如果我们使用像 Java 或 C# 这样的语言,我们已经有了继承,我将接口(interface)视为一种较弱的继承形式,并想:“何必麻烦呢?”从某种意义上说,我是对的,您可以将接口(interface)视为一种弱形式的继承,但除此之外,我最终理解了它们作为语言构造的用途,将它们视为对潜在的许多不相关的对象类所表现出的共同特征或行为进行分类的手段。
例如,假设您有一款 SIM 游戏并具有以下类:
class HouseFly inherits Insect {
void FlyAroundYourHead(){}
void LandOnThings(){}
}
class Telemarketer inherits Person {
void CallDuringDinner(){}
void ContinueTalkingWhenYouSayNo(){}
}
显然,这两个对象在直接继承方面没有任何共同点。但是,你可以说他们都很烦人。
假设我们的游戏需要某种随机事物,让玩家在吃晚饭时感到烦恼。这可能是 HouseFly
或 Telemarketer
或两者兼而有之 - 但如何通过单一功能实现这两种功能呢?如何要求每种不同类型的对象以相同的方式“做他们烦人的事情”?
要认识到的关键是,Telemarketer
和 HouseFly
共享一个共同的松散解释行为,尽管它们在建模方面毫无相似之处。那么,让我们创建一个两者都可以实现的接口(interface):
interface IPest {
void BeAnnoying();
}
class HouseFly inherits Insect implements IPest {
void FlyAroundYourHead(){}
void LandOnThings(){}
void BeAnnoying() {
FlyAroundYourHead();
LandOnThings();
}
}
class Telemarketer inherits Person implements IPest {
void CallDuringDinner(){}
void ContinueTalkingWhenYouSayNo(){}
void BeAnnoying() {
CallDuringDinner();
ContinueTalkingWhenYouSayNo();
}
}
我们现在有两个类,每个类都以自己的方式令人讨厌。而且它们不需要从相同的基类派生并共享共同的固有特征 - 它们只需要满足 IPest
的契约 - 该契约很简单。你只需要变得烦人
。在这方面,我们可以进行以下建模:
class DiningRoom {
DiningRoom(Person[] diningPeople, IPest[] pests) { ... }
void ServeDinner() {
when diningPeople are eating,
foreach pest in pests
pest.BeAnnoying();
}
}
这里有一个餐厅,可以容纳许多食客和许多害虫——请注意界面的使用。这意味着在我们的小世界中,pests
数组的成员实际上可以是 Telemarketer
对象或 HouseFly
对象。
当晚餐供应并且餐厅里的人应该吃饭时,将调用 ServeDinner
方法。在我们的小游戏中,这正是我们的害虫发挥作用的时候——通过 IPest
界面指示每种害虫变得烦人。通过这种方式,我们可以很容易地让 Telemarketers
和 HouseFlys
以各自的方式变得烦人 - 我们只关心 DiningRoom
对象中有一些害虫,我们并不真正关心它是什么,而且它们可能与其他对象没有任何共同点。
这个非常人为的伪代码示例(比我预期的时间要长得多)只是为了说明最终让我明白我们何时可以使用界面的事情。我提前为这个例子的愚蠢表示歉意,但希望它有助于您的理解。而且,可以肯定的是,您在这里收到的其他发布的答案确实涵盖了当今设计模式和开发方法中接口(interface)的使用范围。
关于language-agnostic - "program to an interface"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59475975/
我认为这个问题说明了一切,但我有一个使用 .net 安装工具包的应用程序(在 vs.2005 中),并且用户问我是否可以将它安装在 c:\Program Files\ProgramName 而不是C:
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我是 Stephen Wolfram 的忠实粉丝,但他绝对是一个不怕自吹自擂的人。在许多引用资料中,他将 Mathematica 颂扬为一种不同的符号编程范式。我不是 Mathematica 用户。
我现在正在使用 Squeak4.1 学习 SmallTalk。我使用 Squeak by Example 作为教程,在这里我反驳了一个 delema,“Morphic 是由...开发的,用于自编程语言
Wikipedia有话要说: Total functional programming (also known as strong functional programming, to be cont
在阅读 Paul Graham's Essays 时, 我对 Lisp 越来越好奇了。 在this article ,他提到最强大的功能之一是您可以编写可以编写其他程序的程序。 我无法在他的网站或其他
我知道 functional programming 有几个定义。 .我认为这是一个模糊的类别。我个人的定义是接近' referential transparency '。 这个问题不是“函数式编程的
我注意到许多顶尖大学都开设了类(class),在这些类(class)中,学生将学习与计算机图形学相关的 CS 专业科目。可悲的是,这是我的大学没有提供的东西,我真的很想在 future 几年的某个时候
我正在安装100%托管代码的.NET(C#)应用程序。安装程序(InnoSetup)始终希望将应用程序安装到Vista x64中的“Program Files(x86)”文件夹中,我认为这是因为安装程
假设在 C 中,我们有以下结构: struct MyData { char key1[20]; long key2; ... /* some data */ }; 本质上,除
这个问题已经有答案了: When should I use ampersand with scanf() (3 个回答) 已关闭 6 年前。 所以我在python3中有这个“程序”,它添加了3个字符串
我编写了一个包含 self 更新程序的 Java 应用程序。自更新程序从 Web 服务器加载新的程序版本并替换应用程序文件。如果安装了应用程序,这将完美地工作,例如在用户主目录中,如果它安装在 C:\
注意:标记为社区维基。 是否有一个很好的分析为什么可视化编程语言仍然没有起飞?这些天我们仍在 80x25 文本窗口中“线性”编码;而我们表示的概念(数据结构、算法)似乎可以更直观地表示出来。 最佳答案
我一直在阅读Code Complete 2 .由于我不是以英语为母语的人,因此我需要一些时间才能理解某些陈述。我希望你描述作者在他的书中所做的这两个陈述之间的区别: You should progra
我在为我的 tomcat 设置 CLASSPATH 时遇到了这个问题。我需要在 tomcat 的 CLASSPATH 中引用我的 2 个安装。其中一个位于 C:\Program Files\Postg
这个问题已经有答案了: How can I lock a file using java (if possible) (8 个回答) 已关闭 6 年前。 我有 2-3 个程序可以修改文件,但如果有一个
我 checkout Reading stdout from one program in another program却没有找到我要找的答案 我是 Linux 的新手,我正在使用 Python 中
我有一个程序可以打印出通过或失败。我想检测卡在那里的程序并回显“超时” 我写了这样一个脚本: #!/bin/bash echo -n 'test' && timeout 5 ./mytest | gr
我非常清楚函数式编程技术和命令式编程技术之间的区别。但是现在有一种普遍的趋势是谈论“函数式语言”,这确实让我感到困惑。 当然,像 Haskell 这样的一些语言比 C 等其他语言更欢迎函数式编程。但即
请求:每个进程需要计算自己的组到所有点的距离。我的代码如下: #include stdio.h #include stdlib.h #include math.h #include string.h
我是一名优秀的程序员,十分优秀!