多态:
是指一种事物的多种状态,不同类的对象可以定义共享相同名称的方法,这个就是多态的表现形式.
多态的条件:
继承关系,方法重写,父类的声明变量指向子类对象
优点:
增加了程序的可扩展性
权限控制
修饰符 |
类内部 |
子类 |
任何地方 |
private |
√ |
||
protected |
√ |
√ |
|
public |
√ |
√ |
√ |
示例代码
computer.h
@interface Computer : NSObject { /* @protected//默认的,当前类和子类中可用 @public//任意地方 @private//私有的 */ NSString *name; float price; } @property(nonatomic)float price; @property(nonatomic,copy)NSString *name; -(id)initWithName:(NSString *)name price:(float)price; -(void)printf; @end
computer.m
@implementation Computer -(id)initWithName:(NSString *)name1 price:(float)price1{ if (self = [super init]) { name = name1; price = price1; } return self; } -(void)printf{ NSLog(@"%@,%.2f",name,price); }
MacBook.h
@interface MacBook : Computer @end
MacBook.m
@implementation MacBook -(void)printf{ NSLog(@"%.2f",price); } @end
main.m
#import <Foundation/Foundation.h> #import "Computer.h" #import "MacBook.h" #import "lenovo.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); //一种事物的多种形态 Computer *computer = [[Computer alloc]initWithName:@"acer" price:1000]; [computer printf]; Computer *macbook = [[MacBook alloc]initWithName:@"Macbook pro" price:13000]; [macbook printf]; Computer *lenovo2 = [[lenovo alloc]initWithName:@"联想" price:12345]; [lenovo2 printf]; //处理动态方法的调用 //判断某个类是不是另外一个类的成员 if ([macbook isKindOfClass:[Computer class]]) { NSLog(@"macbook是他的子类"); } //判断能否响应@selector指定的方法 if ([computer respondsToSelector:@selector(printf)]) { NSLog(@"可以响应"); } //对象直接调用这个方法 [computer performSelector:@selector(printf)]; //判断某个类是不是该类的子类 if ([MacBook isSubclassOfClass:[Computer class]]) { NSLog(@"Macbook是他的子类"); } //判断两个对象是否为同一类型 if ([MacBook class] == [lenovo class]) { NSLog(@"是一个类型"); } /* //obj-c中的异常处理 //减少崩溃 @try { //正常代码写入try中 [computer printf]; } @catch (NSException *exception) { //捕获异常名称和原因 NSLog(@"catch exception:%@ , %@",[exception name],[exception reason]); //记录日志 } @finally { //要处理的代码 } */ } return 0; }
明天打算继续看看多态,紧接着把协议和代理再次复习下