iOS:如何使工厂方法与子类化一起工作

时间:2015-05-19 09:28:09

标签: ios objective-c inheritance initialization subclassing

我有一个类Matrix的类,我想将其子类化。让我们调用我的子类Column。我也想为我的子类添加新属性。我喜欢工厂方法,不喜欢重复代码,所以我在子类中创建了一个工厂方法,在初始化对象时调用它的超类'工厂方法。

问题在于,如果我创建了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;
}

1 个答案:

答案 0 :(得分:2)

您始终创建Matrix实例 但是你需要创建当前类的实例

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

如果你这样做

[Matrix matrix]将返回Matrix对象

[Column matrix]将返回Column对象