Swift实现类似Java/C#的抽象类
2020-12-25 本文已影响0人
游龙飞雪
抽象类:本身不能被实例化,只能实例化派生类来使用派生类。
例如iOS多线程知识点中的 NSOperation 类,只能使用其三种派生类 ①NSInvocationOperation ②NSBlockOperation ③自定义Operation 。
而swift、oc(iOS开发)中没有修饰符 Abstract 来修饰类和方法,所以只能人为干预来模仿实现。
例如以类名 AbstractClass 为例:
思路就是拒绝用户调用AbstractClass的初始化器 AbstractClass(),或者用户主动调用的话就抛出异常!
如果拒绝用户调用初始化器 AbstractClass(),因为没有对应修饰符来限定,实现不了。所以只能在内部处理,即一旦主动调用 AbstractClass()就抛出异常!
例:
class AbstractClass {
init() throws {
if type(of: self) == AbstractClass.self {
print("AbstractClass init!")
throw ListError.abstractInitializeError("抽象类不能使用初始化器,请实例化子类!")
}
}
}
class ZhanlangClass : AbstractClass {
override init() {
super.init()
print("ZhanlangClass init!")
}
}
这样,当使用 AbstractClass 的派生类调用初始化器的时候,由于不满足条件,不会进入if分支抛出异常;当使用AbstractClass本类来调用初始化器的话,条件成立,直接崩溃!
目前想到这种方法,同志们还有什么好的方案欢迎留言!