构造方法与类工厂方法

2018-11-06  本文已影响0人  SimpleSJ


// 父类 Person , 子类 Student ,分别提供了自己对应的自定义构造方法与类工厂方法,通过不同的方式分别创建对象

//父类
#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (assign,nonatomic)int age;

-(instancetype)initWithAge:(int)age;

+(instancetype)personWithAge:(int)age;
@end


#import "Person.h"
@implementation Person
-(instancetype)initWithAge:(int)age{
    if (self = [super init]) {//固定格式
        _age = age;
    }
    return self;
}

+(instancetype)personWithAge:(int)age{
    //两种方式都可以
    /*
     这里一定要使用self、不要使用person 不然子类如果通过这种方式创建子类的实例对象,会得到person的实例对象, 子类指针指向父类的对象,很危险.
    Person *p = [[self alloc]init];
    p.age = age;
    return p;
     */
    //一定要使用self,不要使用person,如果子类通过这个方法创建实例对象,才能得到子类的实例对象的地址
    return [[self alloc]initWithAge:age];
}
-(NSString *)description{
    return [NSString stringWithFormat:@"age = %i",_age];
}
@end

//子类

#import "Person.h"

@interface Student : Person
@property (assign,nonatomic)int no;//学号

-(instancetype)initWithAge:(int)age andNo:(int)no;

+(instancetype)studentWithAge:(int)age andNo:(int)no;
@end


#import "Student.h"
@implementation Student
-(instancetype)initWithAge:(int)age andNo:(int)no{
    //谁的事情谁来做,直接调用supper,age属于Person
    //谁调用,就得到谁的实例对象地址
    if (self = [super initWithAge:age]) {
        _no = no;
    }
    return self;
}

+(instancetype)studentWithAge:(int)age andNo:(int)no{
    /*
     Student *s = [Student PersonWithAge:age];
     s.no = no;
     return s;
     */
    
    return [[self alloc]initWithAge:age andNo:no];
}
-(NSString *)description{
    return [NSString stringWithFormat:@"age = %i,no = %i",self.age,_no];
}
@end

//创建对象

    //通过自定义构造方法创建Person的实例对象p1
    Person *p1 = [[Person alloc]initWithAge:10];
    NSLog(@"%@",p1);
    //通过自定义类工厂方法创建Person的实例对象p1
    Person *p2 = [Person personWithAge:20];
    NSLog(@"%@",p2);
    //通过自定义构造方法创建Student的实例对象s1
    Student *s1 = [[Student alloc]initWithAge:10 andNo:123];
    NSLog(@"%@",s1);
    //通过自定义类工厂方法创建Student的实例对象s2
    Student *s2 = [Student studentWithAge:20 andNo:456];
    NSLog(@"%@",s2);
    
    //通过父类的构造方法创建Student的实例对象s3
    Student *s3 = [[Student alloc]initWithAge:30];
    s3.no = 789;
    NSLog(@"%@",s3);
    
    //通过父类的类工厂方法创建Student的实例对象s4
    Student *s4 = [Student personWithAge:40];
    s4.no = 999;
    NSLog(@"%@",s4);

//输出:
2018-11-06 10:17:28.104638+0800 构造方法与类工厂方法[1481:68391] age = 10
2018-11-06 10:17:28.104895+0800 构造方法与类工厂方法[1481:68391] age = 20
2018-11-06 10:17:28.104959+0800 构造方法与类工厂方法[1481:68391] age = 10,no = 123
2018-11-06 10:17:28.105007+0800 构造方法与类工厂方法[1481:68391] age = 20,no = 456
2018-11-06 10:17:28.105036+0800 构造方法与类工厂方法[1481:68391] age = 30,no = 789
2018-11-06 10:17:28.105069+0800 构造方法与类工厂方法[1481:68391] age = 40,no = 999
上一篇 下一篇

猜你喜欢

热点阅读