java - 接口(interface)函数: Utility to span hierarchies?

标签 java android oop android-fragments interface

正如我在另一篇文章(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 之间通信的实用程序?

最佳答案

  1. Is this close?

因为我不是电气工程师,所以我不知道!但我可以尝试把Java的概念放在interface中变成简单的英语。

interface定义了实现类可以“执行”的“内容”列表,但根本没有定义这些类将“执行”该“内容”如何。一个经典的 Java 示例是 List界面,以及 ArrayListLinkedList实现类。由于两者都实现了 List界面,可以add()给他们的元素,或 get()他们的元素,甚至 clear()其中的所有项目。但是ArrayList所有这些事情的执行方式都与LinkedList非常不同。 .

另一个关键点是,当您正确使用接口(interface)时,您不关心正在使用哪个实现类。当您编写使用 List 的代码时,你应该可以自由交换ArrayList出去 LinkedList无需更改您的任何代码。当然,您可能有理由更喜欢一种实现而不是另一种实现,但是您的程序应该能够以任何一种方式运行。

  1. 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/

相关文章:

java - 使用反射替换 java.net.URL URLStreamHandlerFactory 是个好主意吗?

android - 用于登录 Activity 的 IntentService 与 AsyncTask?

android - 我如何在 Android 中写入/cache/recovery/command?

android - 如何在 Android Studio 的模拟器上启用物理键盘? (曾经工作)

python - 是否记录了通过实例访问类变量?

PHP:调用动态函数,但在类中?

java - 如何在 Neo4J Java 中搜索处于一种关系而不是另一种关系的 endNode

java - 在 SQL 查询中包含静态值

java - fx :jar in NetBeans? 在哪里 - JavaFX

c++ - 无法从类型基类的指针访问派生类方法