首页 文章

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

提问于
浏览
0

我有一个 Matrix 类,我'd like to subclass. Let'调用我的子类 Column . 我喜欢重复代码,所以我在子类中创建了一个工厂方法,在初始化对象时调用它的超类'工厂方法 .

问题是,如果我创建一个 Column 类的实例,并调用仅在 Column 中找到的属性,我会收到一个错误,因为我的 Column 类'调用我的 Matrix 类'工厂方法的工厂方法返回一个类型为 Matrix 的实例而不是 Column 或任何子类调用它 . 我明白为什么会这样,但我不知道如何解决这个问题 .

我已经在工厂方法上阅读了以下article,并且知道不应该使用 [[Matrix alloc] init]; 而应该使用 [[self alloc] init]; . 问题是我'm not sure how I' d访问我的实例变量,如 matrixrowsfreeData ,我在我的 Headers 中定义如下:

@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 回答

  • 2

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

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

    如果你这样做

    [Matrix matrix]将返回Matrix对象

    [Column matrix]将返回Column对象

相关问题