父类中返回子类的对象的方法/属性

时间:2012-04-15 13:47:19

标签: objective-c oop

这可能是一个愚蠢的问题,但无论如何它仍然存在。在目标c中,在子类的启动方法中,经常设置self = [super init]。现在,self是子类,并且不需要转换,这意味着(或者不是......)父类的init方法以某种方式返回实际属于子类的对象。

所以我的问题是:我可以在父类中定义其他方法或属性,从子类调用时从子类返回一个对象吗?我认为Java中有类似的工厂方法,所以也许这个问题不是太过分了。

编辑1。让我更好地解释一下我的意思:我知道我可以在ParentClass方法中找到,我实际上是在运行ChildClass类的对象。这是通过查看[自我类]。但是,我想在ParentClass中声明一个方法,从子类返回一个对象,而不知道子项将提前到哪个类。更好的是,我希望返回的对象甚至不需要正式转换。

例如,我想在父类中使用类似以下内容的方法:

-(ChildClass *) partialCopyOfSelf {
//returns an object which is a partial copy of self (only copying properties that also
// exist in parent class, but such that applying [result class] will yield the child class
// and will require no further conversion

(ChildClass *) copy=[[ChildClass alloc] init];
//now copy stuff
return copy;
} 

现在在子类中,我希望能够实现以下类型的东西:

-(MyClass *) copyOfSelf {
MyClass *copy=[super partialCopyOfSelf];
// now copy properties that only exist in my child class
return copy;
}

编辑2(来自我写给@wbyoung的评论)。我想要的原因是,在某些时候我可能想要将父类的属性从ivars更改为可能只是计算一些例如,值,因此孩子不知道如何正确复制它们。我写这篇文章是因为有人可能更清楚如何完成同样的任务。

3 个答案:

答案 0 :(得分:2)

init方法实际上只是处理已经创建的子类的对象。这是对alloc的调用。这是使用您发送消息的类来确定如何分配对象。

话虽如此,您可以覆盖子类中的方法。消息总是发送到对象&方法查找从最顶层开始。

您还可以执行[self class]之类的操作来确定父类中的类型。但这只会让你到目前为止。 [[self class] displayColor]允许您执行类似实现方法和操作的操作。基类中的默认类方法实现,但根据需要覆盖子类中的类方法。

答案 1 :(得分:0)

是的。 Obj-C遵循您在大多数OO语言中找到的所有子类规则。

例如......

@interface Foo : NSObject

@property (readonly) BOOL thing1;
@property (readonly) CGFloat width;

@end

@implementation Foo

-(BOOL)thing1
{
 return YES;
}

-(CGFloat)width
{
 return 30.0f;
}

@end

Bar的界面不需要thing1width的声明或实施。

@interface Bar : Foo

@end

@implementation Bar

-(BOOL)thing1
{
if(test) return YES; 
else return NO;
}

-(CGFloat)width
{
 return [super width] + 20.0f;
}

@end

但是,您可以在子类中实现thing1和/或width以提供不同的值。

父类的实例始终为属性YES返回thing1,而其子类Bar可以返回YES或NO,具体取决于测试结果(例如)。

另一个属性width使用父类值并对其进行更改。

答案 2 :(得分:0)

  

这可能是一个愚蠢的问题,但无论如何它仍然存在。在   目标c,在儿童班的启动方法中经常设定   self = [super init]。现在,self属于子类,没有转换   是必需的,这意味着(或不是......)父进程的init方法   class以某种方式返回一个实际属于该子对象的对象   类。

嗯,不完全是。 -init默认返回id,这只是任何对象。它告诉编译器它是一个对象,并假设你知道你在做什么,所以你不需要强制转换它。


  

所以我的问题是:我可以在一个中定义其他方法或属性   父类,从子类调用时返回一个对象   从孩子班? Java中有类似的东西叫做   工厂方法我想,所以也许这个问题也不是   离谱..

当你在超类'实现中返回self时,你会在调用方法时返回相同的对象。所以答案是肯定的。