我有一个类Matrix
的类,我想将其子类化。让我们调用我的子类Column
。我也想为我的子类添加新属性。我喜欢工厂方法,不喜欢重复代码,所以我在子类中创建了一个工厂方法,在初始化对象时调用它的超类'工厂方法。
问题在于,如果我创建了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;
}
答案 0 :(得分:2)
您始终创建Matrix实例 但是你需要创建当前类的实例
+ (instancetype)matrix
{
Matrix *mt = [[self alloc] init];
....
return mt;
}
如果你这样做
[Matrix matrix]将返回Matrix对象
[Column matrix]将返回Column对象