渐进式编程课
Objective-C 目录
第 18 课2026.09.24

让调用方只依赖摘要契约,而不必知道对象的具体类。

第 18 课:让 Lesson 采纳摘要协议

  • 日期:2026-09-24
  • 课程序号:第 18 课
  • 知识点:类的协议采纳

用途或适用场景

让调用方只依赖摘要契约,而不必知道对象的具体类。

核心概念

类声明中的 <LessonSummarizing> 表示采纳协议;类需实现其要求的 displaySummary getter。

最小代码或操作示例

objective-c
#import <Foundation/Foundation.h>

@protocol LessonSummarizing <NSObject>
@property (nonatomic, readonly, copy) NSString *displaySummary;
@end

@interface Lesson : NSObject <LessonSummarizing>
@property (nonatomic, copy, readonly) NSString *title;
@property (nonatomic, readonly) NSInteger minutes;
- (NSString *)summary;
@end

@implementation Lesson
- (NSString *)summary {
    return [NSString stringWithFormat:@"%@ · %ld 分钟", self.title, (long)self.minutes];
}
- (NSString *)displaySummary { return [self summary]; }
@end

3~5 分钟练习

声明 id<LessonSummarizing> item = [Lesson new];,读取 item.displaySummary。

参考答案

编译器允许通过协议类型读取该属性;运行前还需按既有初始化流程设置标题与时长。

与上一课的联系

沿用第 17 课的协议与第 15 课的 displaySummary getter;本课只在 Lesson 类声明中采纳协议,已有摘要格式化逻辑不变;完成后下一课可让另一个展示对象实现同一协议。

时效校验

时效校验:2026-09-24(Apple Objective-C 官方 Working with Protocols;类采纳协议及必需 getter 的规则未见废弃标记)。

官方参考