Kotlin学习笔记--继承、接口、代理、委托、单例
来源:互联网 发布:catti含金量 知乎 编辑:程序博客网 时间:2024/06/15 23:26
本例是基于安卓开发环境的。我用的Android Studio 写的
现在,有这样3个身份:老大(Activity)、助理(Assistant)、干活的人(Person)
只要是人,就要吃饭,所有,有个抽象基类(Human)定义吃饭,老大手底下的人,需要帮他收钱和干活
/** * 抽象基类 */abstract class Human { abstract fun eat()}
/** * 收钱 */interface IMoney { fun shouqian()}
/** * 办事 */interface IWork { fun working()}
现在,老大给助理和底层人员都分派了任务:收钱和干活。
/** * 助理 */class Assistant:Human(),IMoney,IWork { override fun eat() { println("吃的好") } override fun shouqian() { println("助理,收钱") } override fun working() { println("助理,工作") }}
/** * 干活的人 */class Person : Human(), IMoney, IWork { override fun eat() { println("吃的一般") } override fun shouqian() { println("收钱") } override fun working() { println("工作") }}
import android.os.Bundleimport android.support.v7.app.AppCompatActivityclass MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) var assistant=Assistant() assistant.eat() assistant.shouqian() assistant.working() var person=Person() person.eat() person.shouqian() person.working() }}
结果就是:各干个的。
I/System.out: 吃的好 I/System.out: 助理,收钱 I/System.out: 助理,工作 I/System.out: 吃的一般 I/System.out: 收钱 I/System.out: 工作
现在,情况变了,老大对助理说,给我办2件事,去找XXX把钱收回来;给你100W,把XXX事办了;助理就去找小弟:给你10W,把事办漂亮点
这就是委托和代理了。老大委托助理去办事,助理代老大去办事;而助理把事委托给小弟去办。小弟代助理去办事
注意关键字 by
/** * 助理 */class Assistant:Human(),IMoney,IWork by Person(){ override fun eat() { println("吃的好") } override fun shouqian() { println("助理,收钱") }}
/** * 干活的人 */class Person : Human(), IMoney, IWork { override fun eat() { println("吃的一般") } override fun shouqian() { } override fun working() { println("给了我10W办事") }}
这次,老大直接和助理说的,没有对小弟说,所有代码就是
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) var assistant=Assistant() assistant.eat() assistant.shouqian() assistant.working() }}
结果:
I/System.out: 吃的好 I/System.out: 助理,收钱 I/System.out: 给了我10W办事
说明:从这里可以看出,因为助理通过“by”把办事委托给了小弟,所有,他的代码中可以不写working相关,小弟那里会去做
如果因为一些特殊原因,助理那里需要执行“办事”呢?
/** * 助理 */class Assistant:Human(),IMoney,IWork by Person(){ override fun eat() { println("吃的好") } override fun shouqian() { println("助理,收钱") } override fun working() { println("助理,给了我100W办事") Person().working() println("花了10W,办了100W的事") }}
结果:
I/System.out: 吃的好 I/System.out: 助理,收钱 I/System.out: 助理,给了我100W办事 I/System.out: 给了我10W办事 I/System.out: 花了10W,办了100W的事
注意:一定要有Person().working(),要手动指派一下。如果助理办事的代码写成了
/** * 助理 */class Assistant:Human(),IMoney,IWork by Person(){ override fun eat() { println("吃的好") } override fun shouqian() { println("助理,收钱") } override fun working() { println("助理,给了我100W办事") }}
那么,结果就变成了
I/System.out: 吃的好 I/System.out: 助理,收钱 I/System.out: 助理,给了我100W办事
小弟就不会去办事了,即便在最上面用了“by”
说明:我定义2个接口,就是为了顺便测试一下多个接口(功能)的委托。
/** * 助理 */class Assistant:Human(),IMoney by Person(),IWork by Person(){ override fun eat() { println("吃的好") }}
其他不变。同理
特别注意:
上面代码中,助理手动去调用小弟的办事方法的代码:Person().working()。其实,又在内存中,创建了一个小弟。在by Person()的时候创建了一个,在下面的Person().working()中的Person()又创建了一个。指派是只需要指派给1个小弟的,现在有多个小弟了。不合适。
怎么修改呢?先来看个例子:
先定义一个Student,就是为了测试对象的唯一性,空对象就行
class Student {}
然后:
var s1=Student() var s2=Student() println("s1==s2 ? ${s1==s2}")
打印结果是:
s1==s2 ? false
即:2个student不一样
现在,我们把Student前面的class,变成object
object Student {}
这时,s1、s2那里就会报错。因为写成object,就是代表在内存中,有且只有一个。
改一下Activity那里,变成了
var s1=Student var s2=Student println("s1==s2 ? ${s1==s2}")
Student后面没有了括号,输出结果,也成了
s1==s2 ? true
现在,我们回头再去改一下Person().working()那里,
首先,把Person类里面的class变成object,然后,把助理类中,变成
class Assistant:Human(),IMoney,IWork by Person{ override fun eat() { println("吃的好") } override fun shouqian() { println("助理,收钱") } override fun working() { println("助理,给了我100W办事") Person.working() println("花了10W,办了100W的事") }}
注意:
1、继承和接口的实现,都是在类名后面,和类名用冒号分割,继承的类和接口直接用逗号分割
2、继承的类后面要加括号,如:Human(),接口直接写接口名就行,如:IMoney
3、如果,想继承2个类呢?会报错的。如下
我再定义一个:
abstract class AAA { abstract fun haha()}
/** * 助理 */class Assistant:Human(),AAA(),IMoney by Person(),IWork by Person(){ override fun eat() { println("吃的好") } override fun haha() { }}
AAA()那里会报错:
Only one class may appear(出现) in a supertype list
- Kotlin学习笔记--继承、接口、代理、委托、单例
- kotlin学习笔记——接口与委托
- Kotlin学习笔记之单例创建
- Kotlin学习笔记---单例模式
- kotlin学习笔记——委托属性
- Kotlin 学习笔记(三) 类和继承
- kotlin学习小记--单例
- kotlin学习之单例
- Kotlin学习笔记(1)-类,接口,对象
- Kotlin学习(七): 类和继承、接口与实现
- 接口、继承、委托、事件
- UI学习 第九章 委托(代理)设计模式 单例设计模式
- Kotlin-19.代理/委托类(Delegation)
- Kotlin-20.代理/委托属性(delegated properties)
- Kotlin类、继承、接口实现
- Kotlin学习之委托机制
- Kotlin学习笔记(三)类和继承
- Kotlin 学习笔记(2)类和继承
- NOIP2017_DAY2
- 计划2---灵活粘贴板
- 网络管理软件在高校网络中的应用
- tp3.2结合mysql实现微信自定义分享链接和图文
- Node.js是什么?
- Kotlin学习笔记--继承、接口、代理、委托、单例
- nginx新手指南
- [Leetcode] 454. 4Sum II 解题报告
- 周志华《Machine Learning》学习笔记(16)--概率图模型
- C++ 变量类型
- 通过Ajax方式上传文件,使用FormData进行Ajax请求
- 二叉搜索树的原理和实现
- android中图片压缩分析(下)
- Hadoop2.5.2+Zookeeper3.4.6 + HBase0.98.8-hadoop2环境搭建