iOS抽象类

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • iOS抽象类 思维点 Objective-C 没有抽象类只是指语言的语法构造上没有C++/Java那样专门的abs...
    践行者阅读 7,997评论 1 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,681评论 1 32
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 15,620评论 4 61
  • centos 安装apache + ssl证书 免费证书申请和安装 申请证书 去阿里云平台找证书管理然后证书购买 ...
    _oeo___阅读 711评论 0 1
  • 我们了解了精力管理的重要性,那么该如何来评估它呢? 不加思考的只是蛮干,效果往往不好,任何事情的规...
    锦梭阅读 710评论 0 0

友情链接更多精彩内容