1. 程式人生 > >oc38--類工廠方法在繼承中

oc38--類工廠方法在繼承中

[] nbsp 自定義 har 我們 定義 初始化 type 自己

//  Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property int age;
/*
 什麽是類工廠方法:
 用於快速創建對象的類方法, 我們稱之為類工廠方法
 類工廠方法中主要用於 給對象分配存儲空間和初始化這塊存儲空間
 
 規範:
 1.一定是類方法 +
 2.方法名稱以類的名稱開頭, 首字母小寫
 3.一定有返回值, 返回值是id/instancetype
*/
+ (instancetype)person;

+ (instancetype)personWithAge:(int
)age; @end
//  Person.m

#import "Person.h"

@implementation Person


+ (instancetype)person
{
    // return [[Person alloc] init];
    // 註意: 以後但凡自定義類工廠方法, 在類工廠方法中創建對象一定不要使用類名來創建
    // 一定要使用self來創建
    // self在類方法中就代表類對象, 到底代表哪一個類對象呢?
    // 誰調用當前方法, self就代表誰, 子類調用,self就是子類的類對象。
    return [[self alloc] init];
}

+ (instancetype)personWithAge:(int)age { //Person *p = [[Person alloc] init]; //這樣寫,即使子類調用 返回的就永遠是Person, Person *p = [[self alloc] init]; //子類調用這裏的self是子類對象,此時的p也是子類對象。 p.age = age; return p; } @end
//  Student.h

#import "Person.h"

@interface Student : Person   //繼承Person,就有了Person的age屬性和person,personWithAge方法,以及自己的no屬性,
@property int no; @end
//  Student.m

#import "Student.h"

@implementation Student
@end
//  main.m
//  類工廠方法在繼承中的註意點

#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[]) {

    Student *stu = [Student person]; // 調用父類的person方法,父類用的是self,所以就是創建一個子類Student對象 [[Person alloc] init];
    stu.age = 55;
    NSLog(@"age = %i", stu.age);
    stu.no = 888;
    NSLog(@"no = %i", stu.no);
    
    
    Person *p = [Person person];
    p.age = 100;
    //p.no = 200;
    
    
    Student *stu1 = [Student personWithAge:30];
    Person *p1 = [Person personWithAge:30];
    stu1.no = 888;
    
    return 0;
}

oc38--類工廠方法在繼承中