iOS抽象类
2019-02-22 本文已影响0人
lsh_01
OC实现抽象类
Objective-C 没有抽象类,要实现 abstract class 定义,需要 subclass 来完成。
eg:NSString
是一个抽象类,当你使用它的时候,实际你在使用它的子类。
抽象类本身不具备实际的功能,只能用于派生其子类。抽象类中可以包含构造方法,但是构造方法不能被声明为抽象。
在OC中实现抽象类
声明部分:
@interface OCAbstractClass: NSObject
- (void)function;
// 抽象方法
- (void)abstractFunction;
@end
实现部分:
@implementation OCAbstractClass
- (instancetype)init {
if ([self isMemberOfClass:OCAbstractClass.class]) {
// 不能实现抽象类
// 调用 -doesNotRecognizeSelector: 方法,处理调用消息
[self doesNotRecognizeSelector:_cmd];
return nil;
} else {
self = [super init];
if (self) {
// do something
}
return self;
}
}
- (void)function {
// do something
}
- (void)abstractFunction {
// 调用 -doesNotRecognizeSelector: 方法,处理调用消息
[self doesNotRecognizeSelector:_cmd];
}
@end
Swift实现抽象类
Swift中没有抽象类,要实现 abstract class 定义,需要 Protocol 来完成。
使用Swift 2.0,可以使用协议扩展添加方法实现和计算属性实现。
不能提供成员变量或常量,并且没有动态分派。
在Swift中实现抽象类
protocol SwiftAbstractClass: class {
var abstractProperty: String { get set }
func abstractFunction()
}
extension SwiftAbstractClass {
var property: String {
get {
// do something
return ""
}
set {
// do something
}
}
func function() {
// do something
}
}
需要注意的是:没有动态分派。
下面的例子说明这一点:
protocol SwiftAbstractClass: class {}
extension SwiftAbstractClass {
func function() {
print("SwiftAbstractClass")
}
}
class SwiftClass: SwiftAbstractClass {
func function() {
print("SwiftClass")
}
}
let t = SwiftClass()
t.function() // SwiftClass
(t as SwiftAbstractClass).function() // SwiftAbstractClass
SwiftClass 类的实例 t 调用 function() 时,如果作为 SwiftClass 的实例调用,调用的是 SwiftClass 类中的实现;如果作为 SwiftAbstractClass 的实例调用,调用的是 SwiftAbstractClass 协议中的实现。