正如我在另一篇文章(Fragment to Activity Communications)中所述,我不了解接口。我正在努力了解OOP并正在阅读本网站的帖子和书籍,例如Bruce Eckel(TiJ)的“Thinking in Java”。也许我的问题很大一部分是我没有受过OOP训练。我是一名电气工程师,为8位控制器嵌入式系统编写了汇编语言操作系统。程序语言相对容易理解,OOP仍然有一些谜团,接口就是其中之一。我在这篇文章中有两个问题。
1。界面为模板:
在TiJ中,正如大多数界面解释一样,布鲁斯写道:
“接口说,”实现此特定接口的所有类都将如下所示。“因此,任何使用特定接口的代码都知道可能为该接口调用哪些方法,这就是全部。所以interface用于在类之间建立“协议”。(一些面向对象的编程语言有一个名为protocol的关键字来做同样的事情。)“
从What is an interface in Java?开始,我看到以下内容,似乎与上面的内容相同:
“它有用的用途:它的一个用途是将它用作服务的面孔。当两方合作形成服务请求者和服务提供者的关系时,服务提供商以界面的形式提供服务的面貌(关于服务的外观)。“
对我来说,这类似于提供一个人想要建立一台计算机(类似于程序)一组计算机部件,甚至是他们不会使用的部件(硬件类似于SDK)。在那个HW集中,人们会发现一堆需要编程为CPU的FPGA(类似于接口)。 FPGA非常灵活,几乎可以在任何CPU中使用SW,并且可以在线重新编程。因此,Interfaces似乎提供了一个“模板”,程序员可以根据具体情况进行编码。
这是否接近?
2。跨越层次结构的接口
在Android中,似乎有意使用接口通过其活动(https://developer.android.com/training/basics/fragments/communicating.html)在片段之间提供通信。对我而言,这似乎与(TiJ)有关:
“每当方法使用类而不是接口时,您只能使用该类或其子类。如果您希望将该方法应用于不在该层次结构中的类,则“运气不好。界面放松了这个约束。因此,它允许你编写更多可重复使用的代码。”
从Proper interface use and explanation我看到以下内容,这似乎与上面的内容相同:
“使用继承和接口的一个很好的例子是:假设你正在为电子设备构建一个软件。场景就像(父类 - >继承类):小工具 - >电子小工具 - >电话小工具 - >移动电话 - >智能手机 - >桌面。 并且说移动电话,智能手机和平板电脑具有FM-RADIO的共同特征。其他小工具可以使用此功能,而不是电话小工具。现在,将FM-Radio用作接口将是完美的。每个小工具都会提供自己的FM-Radio定义,但所有小工具都将共享相同的功能。“
因此,关于Fragments之间的通信,Activity的层次结构是:
java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity
Fragment的层次结构是:
java.lang.Object
↳ android.app.Fragment
在编译器中,接口是否提供了连接这些不同层次结构以在片段之间进行通信的实用程序?
答案 0 :(得分:1)
- 这是否接近?
醇>
由于我不是电气工程师,我不知道!但我可以尝试将interface
的Java概念变成简单的英语。
interface
定义了一个" stuff"实施班可以"做",但根本没有定义 这些类将如何做"做" "东西"。一个经典的Java示例是List
接口,以及ArrayList
和LinkedList
实现类。由于两者都实现了List
界面,因此您可以add()
个项目,或get()
项目,甚至clear()
所有项目。但ArrayList
以与LinkedList
完全不同的方式完成所有这些事情。
另一个关键点是,当您正确使用界面时,您不在乎您正在使用哪个实施课程。当您编写使用List
的代码时,您应该可以自由地将ArrayList
换成LinkedList
,而无需更改任何代码。当然,您可能有理由更喜欢一种实现而不是另一种实现,但您的程序应该以任何一种方式起作用。
- 在编译器中,接口是否提供了连接这些不同层次结构以在片段之间进行通信的实用程序?
醇>
我很难理解你究竟在问什么,但我怀疑这个问题证明你误解了为什么建议使用接口进行通信的确切原因。 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;
}
但是如果您有一些其他活动 希望能够使用此Fragment
选择颜色,会发生什么?您的Fragment
会因ClassCastException
而崩溃,因为它取决于Activity
的具体类型。
解决方案是为希望能够从interface
获取颜色的任何人定义Fragment
,然后拥有各种Activity
}类实现该接口。
// 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
依赖于界面而不是特定的Activity
类型,那么它可以与Activity
的任何implements OnColorSelectedListener
重复使用。
因此,简而言之,接口提供了将一个组件连接到"泛型"其他组件,无需担心其他组件的具体类型。
答案 1 :(得分:0)
一般规则是关系类型。 IS A是基类。 CAN DO是界面。即使是抽象类也可以为从它继承的那些实现。