网站首页 > 博客文章 正文
我们可以经常看到有名为“BaseActivity”或“BaseFragment”等的类。其主要论点是他们有时需要覆盖其所有活动类中的某些行为,而继承似乎是一个不错的选择。
但是,使用继承的问题是什么?为什么它是反模式?
首先,“BaseFragment, BaseActivity, BaseX”命名模式完全是反模式。名称应明确说明其职责。
开发者无法正确命名这些父类,原因是他们需要一个具有多重职责的单一父类。
例如,假设需要离开屏幕时记录一次日志,并在返回时再次记录一次,并希望在所有活动中执行此过程。最常见的方法是有一个父活动,例如将其命名为“AnalyticsActivity”。
接下来,假设有来自某处的输入数据,并且需要在某些或所有活动中覆盖“onNewIntent”。我们称之为“IntentHandlerActivity”。
如你所见,现在有两个父活动类,一个是“AnalyticsActivity”,一个是“IntentHandlerActivity”。
许多开发人员会创建一个单一的“BaseActivity”并在其中实现所有这些不同的职责。这完全是反模式。
Kotlin 委托 (Delegations)
委托是一种常见的编程模式。优势在于Kotlin本身支持委托。这是一个强大的特性,可以将功能从一个对象委托给另一个对象。它允许你以灵活且简洁的方式重用代码和组合对象。
接口
Kotlin中的委托通常用于接口。可以将接口的实现委托给另一个对象,而不是在一个类中实现所有方法。
被委托属性
Kotlin还支持属性的委托。可以使用被委托的属性定义属性访问和修改,而无需明确实现getter和setter方法。
如果你看到“by lazy”或“by viewModels()”之类的代码,你很可能已经了解了这种方法的强大之处。
如何用Kotlin委托解决我们的问题
接口:
interface AnalyticsLogger {
fun registerLifecycleOwner(owner: LifecycleOwner)
}
实现类还应该实现LifecycleEventObserver,这样才能观察注册的生命周期拥有者的状态变化。
class AnalyticsLoggerImpl : AnalyticsLogger, LifecycleEventObserver {
override fun registerLifecycleOwner(owner: LifecycleOwner) {
owner.lifecycle.addObserver(this)
}
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_START -> println("User opened the screen.")
Lifecycle.Event.ON_PAUSE -> println("User leaved the screen.")
else -> Unit
}
}
}
们如何在Activity中实现它:
class MainActivity : ComponentActivity(), AnalyticsLogger by AnalyticsLoggerImpl() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
registerLifecycleOwner(this)
}
}
没有扩展任何父类,也没有继承任何东西,使用了一个实现,并将工作委托给其相应的委托,在例子中是“AnalyticsLoggerImpl”,并且只调用了一行代码。
现在,在任何有生命周期的类中使用这个委托时,将能够记录事件,而不需要一个具有多种不同职责的父Activity类。
再创建一个委托来处理新的 intent:
interface DeepLinkHandler {
fun handleDeepLink(activity: Activity, intent: Intent?)
}
class DeepLinkHandlerImpl: DeepLinkHandler {
override fun handleDeepLink(activity: Activity, intent: Intent?) {
// 处理intent
}
}
在的Activity中实现它:
class MainActivity : ComponentActivity(),
AnalyticsLogger by AnalyticsLoggerImpl(),
DeepLinkHandler by DeepLinkHandlerImpl() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
registerLifecycleOwner(this)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
handleDeepLink(this, intent)
}
}
正如你所知,一个类只能继承一次。但是,可以随意实现任意数量的类。
猜你喜欢
- 2024-09-10 全新版Jetpack进阶提升,系统性落地短视频App(完结)
- 2024-09-10 Android开发新选择:Kotlin(kotlin android开发教程)
- 2024-09-10 高兼容低成本,开箱即用的首页性能优化方式被我们找到了
- 2024-09-10 使用Kotlin实战一个BaseActivity并制作一个登录页
- 2024-09-10 Kotlin 1.2 Beta 发布,来看看新特性!
- 2024-09-10 Android自定义控件(高手级)——JOJO同款能力分析图
- 2024-09-10 Spring Boot 自定义Jackson ObjectMapper
- 2024-09-10 android studion 使用kotlin操作ListView代码量的减少
- 2024-09-10 使用Kotlin实战一个Android架构中的MVP模式,简单实用
- 2024-09-10 使用kotlin实现沉浸式状态栏(kotlin ui框架)
你 发表评论:
欢迎- 06-23MySQL合集-mysql5.7及mysql8的一些特性
- 06-23MySQL CREATE TABLE 简单设计模板交流
- 06-23MYSQL表设计规范(mysql设计表注意事项)
- 06-23MySQL数据库入门(四)数据类型简介
- 06-23数据丢失?别慌!MySQL备份恢复攻略
- 06-23MySQL设计规范(mysql 设计)
- 06-23MySQL数据实时增量同步到Elasticsearch
- 06-23MySQL 避坑指南之隐式数据类型转换
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)