这可能是一个愚蠢的问题,但无论如何它仍然存在。在目标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更改为可能只是计算一些例如,值,因此孩子不知道如何正确复制它们。我写这篇文章是因为有人可能更清楚如何完成同样的任务。
答案 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
的界面不需要thing1
或width
的声明或实施。
@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
时,你会在调用方法时返回相同的对象。所以答案是肯定的。