首页 > 技术文章 > objective-c 多态(顺带提一下权限控制)

mo-shou 2013-12-31 01:04 原文

多态:

是指一种事物的多种状态,不同类的对象可以定义共享相同名称的方法,这个就是多态的表现形式.

多态的条件:

继承关系,方法重写,父类的声明变量指向子类对象

优点:

增加了程序的可扩展性

 

 

 

权限控制

 

修饰符

类内部

子类

任何地方

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;
}

 

 

明天打算继续看看多态,紧接着把协议和代理再次复习下

推荐阅读