RecyclerView的OnScrollListener是抽象的class?
RecyclerView's OnScrollListener is an abstract class?
将 RecyclerView.OnScrollListener
设为摘要有什么好处 class?现在你实际上必须创建一个单独的 class 而不是简单地在 Fragment
/Activity
...
中实现监听器的方法
这个问题是在 之前提出的,但答案只是引用了 Google,这似乎并没有真正回答 实际有什么好处。 Google 表示:
Abstract classes allow frameworks to add new methods without breaking existing implementations.
但这一定是真的吗?向抽象 class 添加更多方法也会破坏现有的实现,因为如果不实现,那么扩展它的 class 也必须是抽象的......所以这与向接口添加方法是同样的问题.
他们更改时的差异 here 也说
I also changed it to be an abstract class instead of an interface to make future
changes easier.
但我还是不明白这有什么意义。有谁了解在这种情况下提供的这种变化的好处?如果真的更好,为什么所有其他侦听器都实现为接口而不是抽象 classes?
编辑: 注意 class 中也没有任何具体的实现,所以我看不出在这里使用抽象 class 与一个接口
我认为您对什么是抽象 class 有点困惑。
通过将 RecyclerView.OnScrollListener
作为抽象 class,它允许您拥有滚动条的侦听器,而无需自己编写所有这些方法。这是因为抽象 class 允许功能的默认实现。
如果你想自定义默认实现,那么你所要做的就是重载你想要自定义的方法。您不必创建任何额外的 classes。您所要做的就是 extend
将 OnScrollListener
class 放入您的 activity 然后砰的一声,现在您有了听众。
But is that necessarily true? Adding more methods to an abstract class
would also break existing implementations because if not implemented
then the class extending it would have to be abstract as well... so
it's the same problem as with adding methods to interfaces.
实际上这取决于新方法是否被声明为抽象的。如果您检查 RecyclerView.OnScrollListener
实现,您会发现只有 class 是抽象的。只要他们不添加抽象方法就是安全的。
在方法中没有实现的空白摘要 class 有几个优点。
将其抽象化的第一个原因是您无法创建对象本身。你总是必须有一个 class 来扩展它,这意味着你不能真的不小心创建一个。 (尽管您总是可以 new RecyclerView.OnScrollListener(){}
所以在这种情况下这可能不是一个优势)。
如果方法很多,而你只需要实现一个,你只需要重写一个方法,而不是重写所有的方法留空。通常这是通过有一个接口然后有一个实现接口的抽象 class 来完成的,这样你就可以挑选适合你的版本。这次他们显然选择不这样做。
他们在您的问题中谈到的最后一个优势是,如果开发人员添加方法,他们将不会破坏现有代码。 RecyclerView 目前仍在开发中,它是支持库的一部分,这意味着它不是官方 Android 版本的一部分。 OnScrollListener()
目前有两种方法,onScrollChanged()
和onScrolled()
。如果它是一个接口,您将被迫重写这两种方法才能进行编译。现在,六个月后,他们决定添加更多功能,例如 onScrolling()
。当您更新支持库时,您的代码突然无法编译。您必须遍历每个使用 onScrollListener()
的文件并添加这个您一开始甚至没有使用的新方法。保留 class abstract
意味着他们可以随意添加方法,并且现有代码不会停止编译。
唯一真正的缺点是您不能像添加 OnClickListener
那样将其添加到 Activity
或 Fragment
,因此您必须将其设为内部或匿名 class.
将 RecyclerView.OnScrollListener
设为摘要有什么好处 class?现在你实际上必须创建一个单独的 class 而不是简单地在 Fragment
/Activity
...
这个问题是在
Abstract classes allow frameworks to add new methods without breaking existing implementations.
但这一定是真的吗?向抽象 class 添加更多方法也会破坏现有的实现,因为如果不实现,那么扩展它的 class 也必须是抽象的......所以这与向接口添加方法是同样的问题.
他们更改时的差异 here 也说
I also changed it to be an abstract class instead of an interface to make future changes easier.
但我还是不明白这有什么意义。有谁了解在这种情况下提供的这种变化的好处?如果真的更好,为什么所有其他侦听器都实现为接口而不是抽象 classes?
编辑: 注意 class 中也没有任何具体的实现,所以我看不出在这里使用抽象 class 与一个接口
我认为您对什么是抽象 class 有点困惑。
通过将 RecyclerView.OnScrollListener
作为抽象 class,它允许您拥有滚动条的侦听器,而无需自己编写所有这些方法。这是因为抽象 class 允许功能的默认实现。
如果你想自定义默认实现,那么你所要做的就是重载你想要自定义的方法。您不必创建任何额外的 classes。您所要做的就是 extend
将 OnScrollListener
class 放入您的 activity 然后砰的一声,现在您有了听众。
But is that necessarily true? Adding more methods to an abstract class would also break existing implementations because if not implemented then the class extending it would have to be abstract as well... so it's the same problem as with adding methods to interfaces.
实际上这取决于新方法是否被声明为抽象的。如果您检查 RecyclerView.OnScrollListener
实现,您会发现只有 class 是抽象的。只要他们不添加抽象方法就是安全的。
在方法中没有实现的空白摘要 class 有几个优点。
将其抽象化的第一个原因是您无法创建对象本身。你总是必须有一个 class 来扩展它,这意味着你不能真的不小心创建一个。 (尽管您总是可以 new RecyclerView.OnScrollListener(){}
所以在这种情况下这可能不是一个优势)。
如果方法很多,而你只需要实现一个,你只需要重写一个方法,而不是重写所有的方法留空。通常这是通过有一个接口然后有一个实现接口的抽象 class 来完成的,这样你就可以挑选适合你的版本。这次他们显然选择不这样做。
他们在您的问题中谈到的最后一个优势是,如果开发人员添加方法,他们将不会破坏现有代码。 RecyclerView 目前仍在开发中,它是支持库的一部分,这意味着它不是官方 Android 版本的一部分。 OnScrollListener()
目前有两种方法,onScrollChanged()
和onScrolled()
。如果它是一个接口,您将被迫重写这两种方法才能进行编译。现在,六个月后,他们决定添加更多功能,例如 onScrolling()
。当您更新支持库时,您的代码突然无法编译。您必须遍历每个使用 onScrollListener()
的文件并添加这个您一开始甚至没有使用的新方法。保留 class abstract
意味着他们可以随意添加方法,并且现有代码不会停止编译。
唯一真正的缺点是您不能像添加 OnClickListener
那样将其添加到 Activity
或 Fragment
,因此您必须将其设为内部或匿名 class.