2013-07-26 127 views
1

的初始化我很好奇如何,而不是做內設置超類的實例:如何繼承

- (id)init { 
    if ((self = [super init])) { 
     //initialize subclass objects 
    } 
    return self; 
} 

通過傳遞超類對象的四周

- (id)initWithSuperclass:(Superclass *)superclassObject { 
    if ((self = superclass)) { 
     //initialize subclass objects 
    } 
    return self; 
} 

這是初始化子可能,如果是這樣,我應該避免這樣做嗎?對我來說,它反映的是臭的代碼,但我沒有看到另一種方法來將超類對象的所有數據字段傳遞給子類的初始化,而不知道超類中的每個數據字段。

任何跟隨我的想法/能夠幫助我想辦法通過這個......臭的代碼?

編輯:

好了,說我有A類和B類以下:

@interface A 
    //stuff but we don't know what 
end 

@implementation A 

- (id)init { 
    if (self = [super init]) { 
     //initialize A "stuff" 
    } 
    return self; 
} 

end 

@interface B : A 
    @property (nonatomic, retain) UIButton* one; 
    - initWithA:(A*)superclassObject; 
end 

@implementation B 

- (id)initWithA:(A*)superclassObject { 
    if ((self = superclassObject)) { 
     one = [[UIButton alloc] init]; 
    } 
    return self; 
} 

end 

來這樣做,我尋找的優點是,在A級,我不知道所有的數據字段,因爲它不是我可以訪問的代碼/代碼。但是,我需要延長這個階級。我希望能夠通過引入類B的新數據值(比如上面例子中的「UIButton one」),將類A的實例更改爲類B,而不管數據值/對象是否爲類的對象實例的一部分答:

+1

我不認爲我明白你想達到什麼目的。你可以給一個具體的代碼例子,你認爲在第一個例子中不起作用,但在第二個例子中有效嗎? – herzbube

+0

我編輯我的問題是(我以爲是)更具體。我添加了一個A類 - B類代碼示例。 – Hoodai

+0

這仍然很難理解。讓我們調用你正在呈現的變體1和2的兩個初始化器。在你的示例代碼中,你將展示如何使用變體2來創建一個'UIButton'實例。我不明白你爲什麼不能對變體1做同樣的事情。另外,你在說「我希望能夠將A類的實例更改爲B類」。這是否意味着你不能控制的東西正在創建'A'的實例,並且你想以某種方式將那些已經存在的實例改變爲'B'的實例? – herzbube

回答

1

忽略運行時的模糊高級功能,您嘗試執行的操作在Objective-C中是不可能的 - 您無法將對象實例從超類動態擴展到在流程中添加實例變量的子類實例。

認爲不是「有一個」模型 - 其中B不是A的子類,但具有A類型的實例變量/屬性。

HTH

附錄

看到關於MYButton VS UIButton,爲什麼在所有創建UIButton情況下,新的意見?如果您使用Interface Builder/Xcode生成用戶界面,那麼您可以直接構建您的MYButton - 在設計器中選擇一個UIButton,然後將其類更改爲MYButton,請參閱文檔以瞭解操作方法,然後您將直接創建實例。

+0

你是否認爲它是一個「擁有」模型?你說的不是模型,而是認爲......然後目前還不清楚你的建議是什麼,我認爲它是。 – Hoodai

+0

我的意思是你應該考慮用「擁有」模型來解決你的問題。 – CRD

+0

所以你說的不是繼承A,而應該讓B包含A的屬性? – Hoodai