2015-05-19 63 views
0

我有一類Matrix,我想要繼承。讓我們打電話給我的子類Column。我想爲我的子類添加新的屬性。我喜歡工廠方法,並且不喜歡重複代碼,所以我在我的子類中創建了一個工廠方法,它在初始化對象時調用其超類的工廠方法。iOS:如何使工廠方法與子類化工作

的問題是,如果我創造我Column類的一個實例,並調用只有在Column發現了一個屬性,我得到一個錯誤,因爲我Column類的工廠方法,它調用我Matrix類的工廠方法返回一個Matrix類型的實例,而不是Column或任何子類調用它的實例。我明白爲什麼會發生這種情況,但我不知道如何解決這個問題。

我讀過以下article關於工廠方法,並知道,而不是使用[[Matrix alloc] init];我應該使用[[self alloc] init];。問題是我不知道我怎麼會進入我的實例變量一樣matrixrowsfreeData,我在我的頭定義如下:

@interface Matrix : NSObject <NSCoding, NSCopying> { 

    @public  double *matrix; 
    @public  int  rows; 
    @public  int  columns; 
    @private BOOL freeUpData; 
} 

這裏的工廠方法,我需要幫助我該怎麼重寫它,以便它可以訪問我的實例變量,也可以使用子類化(並且不僅返回一個Matrix實例)。

+ (instancetype)matrixFromArray:(double *)arr Rows:(int)m Columns:(int)n Mode:(refMode)mode 
{ 
    Matrix *mt = [[Matrix alloc] init]; 
    if (mode == YCMCopy) { 

     double *new_m = malloc(m*n*sizeof(double)); 
     memcpy(new_m, arr, m*n*sizeof(double)); 
     mt->matrix = new_m; 
     mt->freeData = YES; 
    } 

    else { 
     mt->matrix = arr; 
     mt->freeData = NO; 
    } 

    if (mode != YCMWeak) { 
     mt->freeData = YES; 
    } 

    mt->rows = m; 
    mt->columns = n; 

    return mt; 
} 
+0

尚不清楚你在問什麼?子類無法返回超類實例,它只能返回一個子類,但這不會因爲Liskov替換原則 - http://en.wikipedia.org/wiki/Liskov_substitution_principle – Paulw11

+0

@ Paulw11剛更新我的答案希望能夠澄清我的問題。如果您更改了投票結束的話,將不勝感激。你也錯了。我的子類正在返回超類實例,因爲我的超類工廠方法是如何寫入的。我想知道如何更新它使子類化成爲可能。 – KingPolygon

+0

你不能從這個超類生成子類的工廠方法,因爲你總能得到超類 - 就像你找到的那樣。你可以改變你的工廠方法以將分配與初始化分開 - 然後你可以在子類中分配對象,然後調用'[super doInitialisation]' – Paulw11

回答

2

你總是創建Matrix實例 但你需要當前類

+ (instancetype)matrix 
{ 
    Matrix *mt = [[self alloc] init]; 
.... 
    return mt; 
} 

的創建實例,如果你這樣做

[字模]會返回Matrix對象

[列矩陣]將返回列對象

+0

該死的我愛你@oxigen。出於某種原因,我正在推翻它,並覺得'Matrix * mt'需要像'self mt'等。 – KingPolygon