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多线程-NSOperation实践

    推荐文章 iOS多线程-NSThread实践 iOS多线程-GCD实践 NSOperation只是一个抽象类,所以...

  • #iOS抽象类

    iOS抽象类 思维点 Objective-C 没有抽象类只是指语言的语法构造上没有C++/Java那样专门的abs...

  • iOS抽象类

    OC实现抽象类 Objective-C 没有抽象类,要实现 abstract class 定义,需要 subcla...

  • IOS 动画案例二

    1、CAAnimation是IOS QuartzCore框架下一个抽象类,遵循了CAMediaTiming协议和C...

  • UIGestureRecognizer

    UIGestureRecognizer基类是一个抽象类,我们主要是使用它的子类(名字包含链接,可以点击跳到ios ...

  • js.pattern -h 模板方法模式

    基于复用技术、抽象类-->继承抽象类 创建抽象类 实现抽象类

  • Dart中的抽象类 多态 以及接口

    抽象类 Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。 1、抽象类...

  • NSOperation

    概述 iOS并发编程中,把每个并发任务定义为一个Operation。NSOperation是一个抽象类,无法直接使...

  • Dart 抽象类 多态 和接口

    抽象类 Dart中的抽象类:Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。抽象类通过a...

  • abstract关键字

    抽象类 PHP5 支持抽象类和抽象方法。抽象类不能被实例化,必须先继承该抽象类,然后实例化该抽象类的子类。抽象类中...

网友评论

    本文标题:iOS抽象类

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