RecyclerView的OnScrollListener是一个抽象类?

时间:2015-06-03 14:33:59

标签: java android oop android-recyclerview

使RecyclerView.OnScrollListener成为抽象类有什么好处?现在你实际上必须创建一个单独的类,而不是简单地在Fragment / Activity中实现监听器的方法......

这个问题在here之前被问过,但答案只是引用谷歌似乎并没有真正回答实际上有什么好处。谷歌表示:

  

抽象类允许框架在不破坏现有实现的情况下添加新方法。

但这一定是真的吗?向抽象类添加更多方法也会破坏现有实现,因为如果没有实现,那么扩展它的类也必须是抽象的...所以它与向接口添加方法的问题相同。

他们改变它时的差异here也说

  

我还把它改成了一个抽象类而不是一个接口来创造未来   变化更容易。

但我再也看不出这有什么意义了。有谁理解在这种情况下提供的这种变化的好处?如果它真的更好,为什么所有其他侦听器都实现为接口而不是抽象类?

编辑请注意,课程中没有任何具体的实现,所以我认为在这里使用抽象类与接口没有固有的好处

3 个答案:

答案 0 :(得分:1)

制作空白抽象类有一些优点,但方法中没有实现。

使其抽象化的第一个原因是您无法创建对象本身。你总是必须有一个扩展它的类,这意味着你不能真正意外地创建它。 (虽然你总是可以去new RecyclerView.OnScrollListener(){},所以也许在这种情况下这不是一个优势。)

如果有很多方法,但你只需要实现一个方法,你只需要覆盖一个方法而不是覆盖所有方法并将它们留空。通常这是通过拥有一个接口然后具有一个实现接口的抽象类来完成的,这样您就可以选择适合自己的版本。他们显然选择不这样做。

最后的优势,以及他们在您的问题中谈论的一个优势是,如果开发人员添加方法,他们就不会破坏现有代码。 RecyclerView目前仍在开发中,它是支持库的一部分,这意味着它不是官方Android版本的一部分。 OnScrollListener()目前有两种方法,onScrollChanged()onScrolled()。如果它是一个接口,您将被迫覆盖这两个方法以进行编译。现在,在接下来的六个月里,他们决定添加更多功能,例如onScrolling()。突然,您的代码在更新支持库时不会编译。您必须浏览使用onScrollListener()的每个文件,然后添加您甚至不首先使用的新方法。保持课程abstract意味着他们可以随意添加方法,并且现有代码不会停止编译。

唯一真正的缺点是,您无法像Activity一样将其添加到FragmentOnClickListener,因此您必须将其设为内部或匿名类

答案 1 :(得分:0)

我认为你对抽象类是什么感到困惑。

通过将RecyclerView.OnScrollListener作为抽象类,它允许您拥有滚动条的监听器,而无需自己编写所有这些方法。这是因为抽象类允许该功能的默认实现。

如果您想自定义默认实现,那么您只需重载要自定义的方法。您不必创建任何额外的课程。您所要做的就是extend OnScrollListener课程进入您的活动和bam,现在您有了听众。

答案 2 :(得分:0)

  

但这一定是真的吗?向抽象类添加更多方法   如果没有实现,也会破坏现有的实现   那么扩展它的类也必须是抽象的......所以   这与向接口添加方法的问题相同。

实际上,这取决于新方法是否被声明为抽象方法。如果检查RecyclerView.OnScrollListener实现,您将看到该类是抽象的。只要他们不添加抽象方法就是安全的。