iOS抽象类

作者: lsh_01 | 来源:发表于2019-02-22 12:59 被阅读0次

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

    相关文章

      网友评论

        本文标题:iOS抽象类

        本文链接:https://www.haomeiwen.com/subject/uyteyqtx.html