我有一類Matrix
,我想要繼承。讓我們打電話給我的子類Column
。我想爲我的子類添加新的屬性。我喜歡工廠方法,並且不喜歡重複代碼,所以我在我的子類中創建了一個工廠方法,它在初始化對象時調用其超類的工廠方法。iOS:如何使工廠方法與子類化工作
的問題是,如果我創造我Column
類的一個實例,並調用只有在Column
發現了一個屬性,我得到一個錯誤,因爲我Column
類的工廠方法,它調用我Matrix
類的工廠方法返回一個Matrix
類型的實例,而不是Column
或任何子類調用它的實例。我明白爲什麼會發生這種情況,但我不知道如何解決這個問題。
我讀過以下article關於工廠方法,並知道,而不是使用[[Matrix alloc] init];
我應該使用[[self alloc] init];
。問題是我不知道我怎麼會進入我的實例變量一樣matrix
,rows
和freeData
,我在我的頭定義如下:
@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;
}
尚不清楚你在問什麼?子類無法返回超類實例,它只能返回一個子類,但這不會因爲Liskov替換原則 - http://en.wikipedia.org/wiki/Liskov_substitution_principle – Paulw11
@ Paulw11剛更新我的答案希望能夠澄清我的問題。如果您更改了投票結束的話,將不勝感激。你也錯了。我的子類正在返回超類實例,因爲我的超類工廠方法是如何寫入的。我想知道如何更新它使子類化成爲可能。 – KingPolygon
你不能從這個超類生成子類的工廠方法,因爲你總能得到超類 - 就像你找到的那樣。你可以改變你的工廠方法以將分配與初始化分開 - 然後你可以在子類中分配對象,然後調用'[super doInitialisation]' – Paulw11