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 中定义的 matrixrowsfreeData 等实例变量,如下所示:

@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列对象