Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有赢得';不要破坏未来的修改_Java_Oop_Inheritance_Interface - Fatal编程技术网

Java 具有赢得';不要破坏未来的修改

Java 具有赢得';不要破坏未来的修改,java,oop,inheritance,interface,Java,Oop,Inheritance,Interface,我正在阅读Android的RecyclerView的源代码,我正在使用SimpleOnItemTouchListener并阅读关于这个类的文档。但我不确定我是否理解这句话的含义: 使用此类的另一个好处是将来的兼容性。由于接口可能会更改,我们将始终在此类上提供默认实现,以便在更新到新版本的支持库时代码不会中断 这是因为SimpleOnItemTouchListener实现了OnItemTouchListener并提供了一些默认行为吗?因此,如果更新了OnItemTouchListener,则Sim

我正在阅读Android的
RecyclerView
的源代码,我正在使用
SimpleOnItemTouchListener
并阅读关于这个类的文档。但我不确定我是否理解这句话的含义:

使用此类的另一个好处是将来的兼容性。由于接口可能会更改,我们将始终在此类上提供默认实现,以便在更新到新版本的支持库时代码不会中断

这是因为
SimpleOnItemTouchListener
实现了
OnItemTouchListener
并提供了一些默认行为吗?因此,如果更新了
OnItemTouchListener
,则
SimpleOnItemTouchListener
仍将返回默认行为

关于“接口是否可能更改”的部分。他们是在谈论OnItemTouchListener吗

但是,
SimpleOnItemTouchListener
似乎只有空方法,没有其他方法

这是因为SimpleOnItemTouchListener实现了OnItemTouchListener并提供了一些默认行为吗

不,它只是用空方法实现接口。正如您所知,当您实现接口时,您需要为所有接口方法添加定义,否则您将得到编译错误。但是如果你扩展了一个类,你就不需要覆盖所有的基方法(除非它们不是抽象的,但这里不是这样)

关于接口是否可能更改的部分。他们是在谈论蒙图希利斯特吗

是的,他们谈到正在更改接口RecyclerView.OnItemTouchListener:


假设他们向RecyclerView.OnItemTouchListener添加了一个新方法:
void foo()
,那么如果您升级了支持库,并且直接在类中实现了
RecyclerView.OnItemTouchListener
,那么您将得到编译器错误(您需要在类中实现
foo()
)。在android团队中,他们承诺将在中实现foo(),因此如果您在
MyOnItemTouchListener
中扩展它,他们将已经有空的实现-因此没有编译错误。

假设您有以下接口:

public interface OnItemTouchListener {
    boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
    void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
    void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept);
}
您决定自己实施:

public class MyOwnOnItemTouchListener implements OnItemTouchListener {

    @Override
    boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
        boolean result = doSomething(e);
        return result;
    }

    @Override
    void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
        doSomethingElse(rv, e);
        doSomethingMore(rv);
    }

    @Override
    void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        if (disallowIntercept) {
            doADifferentThing();
        }
    }
}
一切都很好…
... 直到六个月后,
onimtouchlistener
被修改以引入一种新方法:

public interface OnItemTouchListener {
    boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
    void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
    void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept);
    // New method
    void onMultiTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
}
突然,你的应用程序不再编译了,我发现它或多或少是一个实现。随着android的不断发展,交互将永远不会相同,并将随着操作系统的发展而不断发展

在这里,可以实现根接口OnItemTouchListener,以便应用程序控制已使用或正在使用的触摸事件。简单地说,
onimtouchlistener
说“你想处理触摸事件吗?实现我!但要准备好处理我为你捕捉到的各种新手势。我是动态的

现在,另一个人
SimpleOnItemTouchListener
站在中间说,“嘿,我可以 您的顾问与
OnItemTouchListener
。我们可以就处理事宜达成协议。即使
OnItemTouchListener
对新事物感到愤怒,我也会帮助您保持冷静,不要改变。我会承受痛苦,确保您不受打扰”

因此,它的简单性,
OniTouchListener
可能会随着Android的发展而发展
SimpleOnItemTouchListener
可能会随着
OnItemTouchListener
的发展而演变,但不会在当前的任何行为中弃用或退化


添加更多内容,因为
SimpleOnItemTouchListener
为您提供了一个默认实现,所以您的代码看起来很整洁,因为您只需要覆盖所需的内容

我目前正在为我正在进行的项目开发一个插件框架。我试图通过对接口进行版本控制来解决这个问题。我有一个基本的实现,就像瓦伦所说的。然而,我担心的是那些实现接口而不是基本实现的人。当然,如果我更改了接口并发布了新版本,我就破坏了那些决定不扩展基类的插件

核心应用程序使用该部分代码所需的接口的任何版本。V2版本的接口将扩展V1,V3版本将扩展V2,等等。我没有直接调用所有插件,而是使用一个管理器类来完成这项工作。这使我能够确保,如果一个V3特性试图执行,我只在实现了V3版本插件接口的插件上执行

如果我只是公开基类并对公共API隐藏接口,我可能只需要一个其他人扩展的基类实现就可以了。不幸的是,由于接口也是公共的,我必须确保我不会破坏没有扩展基类的开发人员