一.抽象类
- 抽象是相对于具象而言的
- 因为抽象没有具体的事物对应,所以抽象类是不能够实例化的
1. 定义抽象类
abstract class Shape {
abstract var mWidth: Double;
abstract var mHeight: Double;
abstract var mRadius: Double;
/**
* 抽象的函数
*/
abstract fun area(): Double;
/**
* 实现的函数
*/
open fun onClick() : Unit {
println(" I Am Clicked~");
}
}
- 抽象类使用
abstract
标注
- 抽象类中可以有没有实现的抽象方法,也可以有实现的方法
- 抽象类中已经实现的方法,默认是
final
的,子类不可以重写
- 在前面加上
open
关键字,子类就能重写
2. 继承抽象类
class Circle(
override var mWidth: Double,
override var mHeight: Double,
override var mRadius: Double
) : Shape() { // 声明类的同时,也声明了构造函数
override fun area(): Double {
return 3.14 * mRadius * mRadius;
}
}
二. 接口
- 使用关键字
interface
来定义接口
Kotlin
的接口既可以包含抽象方法的声明也可以包含其实现
- 接口中定义的方法,并不需要
open
关键字修饰,它们默认就是open
的
- 接口的属性和方法,在实现类中的实现都要使用
override
关键字
2. 接口
接口是一种比抽象类更加抽象的'类',是抽象类的延伸,
interface IBasePresenter {
/**
* 绑定操作
*/
fun attach(view: IBaseView): Unit;
/**
* 解绑操作
*/
fun detach(): Unit;
}
3. 定义一个抽象类实现接口
abstract class BasePresenter : IBasePresenter {
/**
* 创建一个持有 IBaseView 的软引用对象
*/
private lateinit var mReference: SoftReference<IBaseView>;
/**
* 软引用持有IBaseView
*/
override fun attach(view: IBaseView) {
mReference = SoftReference(view);
}
/**
* 解除软引用
*/
override fun detach() {
mReference.clear();
}
}
接口与抽象类的区别
- 抽象类有状态,接口没有状态(属性)
- 抽象类有方法实现,接口只能有无状态的默认实现
- 抽象类只能单继承,接口可以多实现
- 抽象类反应本质,接口体现能力