iOS: 如何使工厂方法与子类一起工作
iOS: How to make factory method work with subclassing
我有一个 class 类型 Matrix
,我想将其子class。让我叫我的subclassColumn
。我也想为我的 subclass 添加新属性。我喜欢工厂方法,不喜欢重复代码,所以我在我的 subclass 中创建了一个工厂方法,它在初始化 object 时调用它的 superclass' 工厂方法。
问题是,如果我创建 Column
class 的实例,并调用仅在 Column
中找到的 属性,我会收到错误消息,因为我的 Column
class' 调用我的 Matrix
class' 工厂方法的工厂方法是 returning 类型 Matrix
的实例而不是 Column
或任何 subclass 调用它。我明白为什么会这样,但我不确定如何解决这个问题。
我阅读了以下关于工厂方法的 article,并且知道我应该使用 [[self alloc] init];
而不是 [[Matrix alloc] init];
。问题是我不确定如何访问我在 header 中定义的 matrix
、rows
和 freeData
等实例变量,如下所示:
@interface Matrix : NSObject <NSCoding, NSCopying> {
@public double *matrix;
@public int rows;
@public int columns;
@private BOOL freeUpData;
}
这是我需要帮助的工厂方法。我如何重写它以便它可以访问我的实例变量,并且还可以使用 subclassing(不仅是 return a 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;
}
您总是创建 Matrix 实例
但您需要创建当前 class
的实例
+ (instancetype)matrix
{
Matrix *mt = [[self alloc] init];
....
return mt;
}
如果你这样做了
[Matrix矩阵]将returnMatrix对象
[列矩阵]将return列对象
我有一个 class 类型 Matrix
,我想将其子class。让我叫我的subclassColumn
。我也想为我的 subclass 添加新属性。我喜欢工厂方法,不喜欢重复代码,所以我在我的 subclass 中创建了一个工厂方法,它在初始化 object 时调用它的 superclass' 工厂方法。
问题是,如果我创建 Column
class 的实例,并调用仅在 Column
中找到的 属性,我会收到错误消息,因为我的 Column
class' 调用我的 Matrix
class' 工厂方法的工厂方法是 returning 类型 Matrix
的实例而不是 Column
或任何 subclass 调用它。我明白为什么会这样,但我不确定如何解决这个问题。
我阅读了以下关于工厂方法的 article,并且知道我应该使用 [[self alloc] init];
而不是 [[Matrix alloc] init];
。问题是我不确定如何访问我在 header 中定义的 matrix
、rows
和 freeData
等实例变量,如下所示:
@interface Matrix : NSObject <NSCoding, NSCopying> {
@public double *matrix;
@public int rows;
@public int columns;
@private BOOL freeUpData;
}
这是我需要帮助的工厂方法。我如何重写它以便它可以访问我的实例变量,并且还可以使用 subclassing(不仅是 return a 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;
}
您总是创建 Matrix 实例 但您需要创建当前 class
的实例+ (instancetype)matrix
{
Matrix *mt = [[self alloc] init];
....
return mt;
}
如果你这样做了
[Matrix矩阵]将returnMatrix对象
[列矩阵]将return列对象