本文共 2908 字,大约阅读时间需要 9 分钟。
在学习Objective-C(OC)时,许多开发者可能会感到困惑,特别是面对封装、继承、多态等概念时。作为一名刚入门的开发者,我也曾经为这些概念感到头疼。因此,我决定深入研究这些概念,并将自己的理解整理出来,以便更好地掌握OC的核心特性。
封装是面向对象编程的核心概念之一。简单来说,封装就是把对象的内部状态信息隐藏起来,只允许通过特定的方法来访问这些信息。这样做的好处有很多:
在OC中,封装通过四种访问控制符来实现:@private、@package、@protected 和 @public。每种符号对应不同的访问范围:
@private:只能在当前类中使用。@package:在当前类及其同一映像的其他类中使用。@protected:在当前类及其子类中使用。@public:在任何地方使用。例如:
@interface Car : NSObject { NSString *_brand; // 通过@private限制,只能在Car类内部访问 NSString *_color; // 同样使用@private}- (void)setBrand:(NSString *)brand; // 使用@public,任何地方都可以调用- (void)setColor:(NSString *)color; // 同样使用@public@end 值得注意的是,OC中方法没有修饰符的概念,默认是公开的(@public)。如果想让一个方法不被外界访问,只需在.m文件中定义该方法,不在.h文件中声明即可。
在OC2.0及以上版本中,属性的合成变得更加简便。通过使用@property指令,可以自动为属性生成setter和getter方法,避免重复手动编写。使用@property时,可以选择不同的指示符来定制合成行为:
assign:简单的赋值,不支持引用计数。atomic:确保属性的访问是原子性的,适用于线程安全的场景。copy:在设置属性时进行深拷贝,防止原对象被修改影响到属性。如果需要自定义属性名,可以在实现部分使用@synthesize指令来自定义getter和setter方法。
例如:
@interface Car : NSObject { NSString *_brand; NSString *_color;}@property assign, atomic NSString *brand;@property copy NSString *color;- (void)printCarInfo { NSLog(@"品牌:%@,颜色:%@", self.brand, self.color);}@end 继承是面向对象编程的核心特性之一。通过继承,一个子类可以继承父类的所有属性和方法,包括成员变量和初始化方法。
例如,以下是一个简单的继承关系:
@interface Car : NSObject { NSString *_brand; NSString *_color;}@interface Taxi : Car { NSString *_company;}@interface CustomerCar : Car { NSString *_owner;} 子类可以扩展父类的功能,例如在Taxi类中添加新的属性和方法:
@interface Taxi : Car { NSString *_company;}- (void)printTicket { NSLog(@"出租车信息:品牌:%@,公司:%@,颜色:%@", self.brand, self.company, self.color);}@end 需要注意的是,子类接口部分定义的成员变量不能与父类接口部分定义的成员变量重名。同时,父类实现部分定义的成员变量对子类没有任何影响。
在OC中,多态体现在方法的动态调用上。当子类重写父类的方法时,OC会根据运行时对象的类型来动态调用相应的方法。
例如:
@interface Car : NSObject { NSString *_brand; NSString *_color;}- (void)brake { NSLog(@"刹车");}- (void)quicken { NSLog(@"加速");}@interface Taxi : Car { NSString *_company;}- (void)brake { [super brake]; // 调用父类的刹车方法 NSLog(@"出租车刹车");}- (void)quicken { [super quicken]; // 调用父类的加速方法 NSLog(@"出租车加速");}- (void)printTicket { NSLog(@"出租车打印发票:品牌:%@,公司:%@,颜色:%@", self.brand, self.company, self.color);} 通过super关键字,可以调用父类的方法;通过self关键字,可以调用当前类的方法。这种特性使得系统更加灵活,适用于不同的需求。
在OC中,子类可以通过继承父类的属性来减少代码重复。子类可以在实现部分添加新的属性或方法,不会影响到父类的属性。
例如:
@interface Car : NSObject { NSString *_brand; NSString *_color;}@interface Taxi : Car { NSString *_company;} Taxi类可以访问Car类的所有属性和方法,同时可以添加自己的属性和方法。例如:
@interface Taxi : Car { NSString *_company;}- (void)printTicket { NSLog(@"出租车打印发票:品牌:%@,公司:%@,颜色:%@", self.brand, self.company, self.color);} 通过以上内容,我希望对OC中的封装、继承、多态等核心概念有了更深入的理解。如果你有任何疑问或建议,欢迎留言讨论!
转载地址:http://ppsfk.baihongyu.com/