oc38--類工廠方法在繼承中
阿新 • • 發佈:2017-08-23
[] 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--類工廠方法在繼承中