ios底层原理

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 协议中的实现。

上一篇下一篇

猜你喜欢

热点阅读