正如我在另一篇文章(Fragment to Activity Communications)中所说,我不理解接口(interface)。我正在尝试理解 OOP,并且正在阅读该网站的帖子和书籍,例如 Bruce Eckel (TiJ) 的“Thinking in Java”。也许我的问题很大一部分是因为我没有接受过面向对象编程的培训。我是一名电气工程师,为 8 位 Controller 嵌入式系统编写了汇编语言操作系统。过程语言相对容易理解,OOP仍然有一些神秘之处,接口(interface)就是其中之一。我在这篇文章中有两个问题。
<强>1。界面作为模板:
在 TiJ 中,正如大多数界面解释一样,Bruce 写道:
“接口(interface)说,“实现这个特定接口(interface)的所有类都将如下所示。”因此,使用特定接口(interface)的任何代码都知道可能会为该接口(interface)调用哪些方法,仅此而已。接口(interface)用于在类之间建立“协议(protocol)”。(一些面向对象的编程语言有一个名为protocol的关键字可以做同样的事情。)”
来自What is an interface in Java? ,我看到以下内容,似乎与上面说的是同一件事:
“它的用途:它的用途之一是用作服务的面孔。当两方共同形成服务请求者和服务提供者类型的关系时,服务提供者以接口(interface)的形式提供服务的外观(服务的外观)。”
对我来说,这类似于为想要构建计算机(类似于程序)的人提供一组计算机部件,甚至是他们不会使用的部件(类似于 SDK 的硬件)。在该硬件集中,人们会发现一堆需要像 CPU 一样进行编程的 FPGA(类似于接口(interface))。 FPGA 非常灵活,它们几乎可以是任何 CPU、软件,并且可以在电路中重新编程。因此,接口(interface)似乎提供了一个"template",程序员可以根据自己的具体情况进行编码。
这接近吗?
<强>2。跨越层次结构的接口(interface)
在 Android 中,人们似乎打算使用接口(interface)通过其 Activity ( https://developer.android.com/training/basics/fragments/communicating.html ) 来提供 Fragment 之间的通信。对我来说,这似乎与(TiJ)有关:
“每当一个方法与类而不是接口(interface)一起使用时,您就只能使用该类或其子类。如果您想将该方法应用于不在该层次结构中的类,您可以运气不好。接口(interface)大大放松了这一限制。因此,它允许您编写更多可重用的代码。”
来自Proper interface use and explanation我看到以下内容,似乎与上面所说的内容相同:
“使用继承和接口(interface)的一个很好的例子是:假设您正在为电子设备构建软件。场景就像(父类 -> 继承类):小工具 -> 电子小工具 -> 电话小工具 -> 手机 -> 智能手机 -> Tablest。 并说手机、智能手机和平板电脑都有一个共同的功能:FM-RADIO。此功能在非电话小工具的其他小工具中可用。现在使用 FM-Radio 作为接口(interface)就完美了。每个小工具都会提供自己的 FM radio 定义,但所有小工具都会共享相同的功能。”
所以,对于Fragment之间的通信,Activity的层次结构是:
java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity
而Fragment的层次结构是:
java.lang.Object
↳ android.app.Fragment
在编译器内部,接口(interface)是否提供了在这些不同层次结构之间进行连接以提供 fragment 之间通信的实用程序?
最佳答案
- Is this close?
因为我不是电气工程师,所以我不知道!但我可以尝试把Java的概念放在interface
中变成简单的英语。
安interface
定义了实现类可以“执行”的“内容”列表,但根本没有定义这些类将“执行”该“内容”如何。一个经典的 Java 示例是 List
界面,以及 ArrayList
和LinkedList
实现类。由于两者都实现了 List
界面,可以add()
给他们的元素,或 get()
他们的元素,甚至 clear()
其中的所有项目。但是ArrayList
所有这些事情的执行方式都与LinkedList
非常不同。 .
另一个关键点是,当您正确使用接口(interface)时,您不关心正在使用哪个实现类。当您编写使用 List
的代码时,你应该可以自由交换ArrayList
出去 LinkedList
无需更改您的任何代码。当然,您可能有理由更喜欢一种实现而不是另一种实现,但是您的程序应该能够以任何一种方式运行。
- Inside the compiler, do interfaces provide the utilty to connect between those different hierarchies to provide communication between Fragments?
我很难准确理解您在问什么,但我怀疑这个问题证明您误解了建议使用接口(interface)在 Fragment
之间进行通信的确切原因。和一个Activity
.
假设您有一个Fragment
(请记住,它应该是一个可重用组件),允许您选择颜色。您的Activity
需要使用这种颜色来绘制画笔描边或类似的东西。从 Fragment
返回此颜色信息的一种方法到Activity
会写这样的东西:
// in the Fragment
private void sendColor(int color) {
PaintingActivity activity = (PaintingActivity) getActivity();
activity.setPaintbrushColor(color);
}
// in the Activity
public void setPaintbrushColor(int color) {
myPaintbrushColor = color;
}
但是,如果您有一些其他 Activity也希望能够使用此 Fragment
选择颜色?您的Fragment
会因ClassCastException
而崩溃因为它取决于您的 Activity
的具体类型.
解决方案是定义一个 interface
对于想要从 Fragment
获取颜色的任何人 ,然后就有你的各种Activity
类实现该接口(interface)。
// interface definition
public interface OnColorSelectedListener {
public void onColorSelected(int color);
}
// in your Fragment
private void sendColor(int color) {
OnColorSelectedListener listener = (OnColorSelectedListener) getActivity();
listener.onColorSelected(color);
}
// your Activity
public class PaintingActivity implements OnColorSelectedListener {
...
@Override
public void onColorSelected(int color) {
myPaintbrushColor = color;
}
}
现在你的Fragment
依赖于接口(interface)而不是特定的 Activity
类型,它可以与任何 Activity
重复使用那implements OnColorSelectedListener
.
因此,简而言之,接口(interface)提供了将一个组件连接到“通用”其他组件的能力,而无需担心该其他组件的特定类型。
关于java - 接口(interface)函数: Utility to span hierarchies?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46966109/