Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:如何使工厂方法与子类化一起工作_Ios_Objective C_Inheritance_Initialization_Subclassing - Fatal编程技术网

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

iOS:如何使工厂方法与子类化一起工作,ios,objective-c,inheritance,initialization,subclassing,Ios,Objective C,Inheritance,Initialization,Subclassing,我有一个类型为Matrix的类,我想将其作为子类。让我们调用我的子类列。我还想给我的子类添加新属性。我喜欢工厂方法,不喜欢重复代码,所以我在我的子类中创建了一个工厂方法,在初始化对象时调用其超类的工厂方法 问题是,如果我创建了列类的一个实例,并调用了仅在列中找到的属性,我会得到一个错误,因为调用myMatrixclass”工厂方法的myColumnclass”工厂方法返回的是类型为Matrix的实例,而不是Column或任何子类调用它的实例。我理解为什么会发生这种情况,但我不知道如何解决 我已经

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

问题是,如果我创建了
类的一个实例,并调用了仅在
中找到的属性,我会得到一个错误,因为调用my
Matrix
class”工厂方法的my
Column
class”工厂方法返回的是类型为
Matrix
的实例,而不是
Column
或任何子类调用它的实例。我理解为什么会发生这种情况,但我不知道如何解决

我已经阅读了以下关于工厂方法的内容,并且知道不使用
[[Matrix alloc]init]我应该使用
[[self alloc]init]。问题是我不确定如何访问实例变量,如
矩阵
自由数据
,我在标题中定义如下:

@interface Matrix : NSObject <NSCoding, NSCopying> {

    @public     double  *matrix;
    @public     int     rows;
    @public     int     columns;
    @private    BOOL    freeUpData;
}

您总是创建矩阵实例 但您需要创建当前类的实例

+ (instancetype)matrix
{
    Matrix *mt = [[self alloc] init];
....
    return mt;
}
如果你这么做了

[矩阵]将返回矩阵对象


[Column matrix]将返回Column对象

不清楚您在问什么?子类不能返回超类实例,它只能返回子类,但由于Liskov替换原则,@Paulw11刚刚更新了我的答案,希望这能澄清我的问题。如果您将投票改为结束,我将不胜感激。你也错了。我的子类正在返回一个超类实例,因为我的超类工厂方法是如何编写的。我想知道如何更新它以使子类化成为可能。你不能从子类中获得这个超类工厂方法,因为你总是会得到超类——正如你所发现的那样。您可以更改工厂方法以将分配与初始化分离-然后您可以在子类中分配对象,然后调用
[super doinitialization]
啊,我看您有没有机会给我举个例子?该死的,我爱你@oxigen。出于某种原因,我想得太多了,觉得
Matrix*mt
需要像
self-mt
,等等。
+ (instancetype)matrix
{
    Matrix *mt = [[self alloc] init];
....
    return mt;
}