2015-12-02 103 views
1

我正在重構兩個類,試圖將它們合併爲一個,其中之前一個是另一個的較重版本。問題在於較重的班級並未完全包圍較輕的班級。我正在考慮創建一個包含所有必需屬性的類,其中每個預先存在的類現在是同一類的一部分,但是使用不同的初始化器實例化。在對象上未使用的屬性有什麼傷害?

爲了給你一個想法,讓我們說,我想,以減少這些:

ClassA.h 

@interface 
@property int shared1; 
@property int shared2; 
@property int a1; 
@property int a2; 
@end 

ClassB.h 

@interface 
@property int shared1; 
@property int shared2; 
@property int b1; 
@property int b2; 
@end 

我的計劃是把這些結合起來:

ClassC.h 
@interface 
@property int shared1; 
@property int shared2; 
@property int a1; 
@property int a2; 
@property int b1; 
@property int b2; 

- (id) initHeavyVersion; // this will set b1 and b2 as well as shared but not a1/a2 
- (id) initLightVersion; // this will set a1 and a2 as well as shared but not b1/b2 
@end 

是否有這樣做的時候不造成任何傷害重疊的屬性本身可能是相當大的對象?我看到它的方式,當這些屬性未被使用時,它們應該只是攜帶一些額外的nil,只不過是。所以性能/內存問題應該是最小的。不利之處在於混亂的公共界面。

我拒絕作文,因爲那仍然會導致兩個班級,而我的目標是將這些班級壓縮成一個(幾乎任何成本)。同樣,代表也會產生同樣的問題。

我看到的唯一選擇是使用關聯的對象,但這看起來不必要地棘手/花哨,並且仍然依賴於單獨的初始化函數。

任何批評或替代建議將是最受歡迎的。

回答

2

面向對象編程的常用方法是將共享部分設爲抽象超類。這樣,第一個(具體)子類只有A屬性,第二個(具體)子類只有B屬性,但共享材質的功能封裝得很好。實施超類本身永遠不應實例化的規則很容易實現。

如果你堅持只有一個類,你基本上正在做面向對象編程的。這沒有錯;這有點奇怪。如果你打算這樣做,我會建議添加一些錯誤檢查。例如,您可以有一個標誌,指出這是A類型還是B類型,以便在有人試圖從B類型訪問A屬性時引發異常。但是這對我來說似乎很難理解,因爲你正在以一種低級的方式重新實現面向對象。類層次結構的全部目的是用類型學取代條件;你試圖撤消這個好處,我不明白爲什麼。

相關問題