objective-c:从父级分配子类并使用父类实例变量

时间:2012-01-18 19:44:19

标签: objective-c ios

我想知道这是否可行 从父级分配子类并使用父类实例varriable

例如,我有一个名为PARENTCLASS的父类和一个子类CHILDCLASS。如果我做了类似下面的事情,它就不起作用,因为分配了CHILD类,而父变量是nil。

@interface PARENTCLASS : NSObject
{
    NSString *something;
}

@implementation PARENTCLASS
@synthesize something

- (void) doSomething
{
    CHILDCLASS *c = [[CHILDCLASS alloc]init];
    [c doSomething];
}
@end


and then in child subclass PARENT
@implementation PARENTCLASS
@synthesize somthing

- (void) doSomething
{
    NSLog(something);
}
@end

1 个答案:

答案 0 :(得分:4)

不确定你究竟在问什么,希望答案在下面的某处:

@interface中定义的实例变量具有以下可访问性之一:

  • @public - 任何人都可以访问它们

  • @private - 除了拥有类以外的任何人都可以访问它们

  • @protected - 拥有类和任何派生(子)类可以访问它们(反过来说,子类可以访问其父类,其祖父母等的受保护实例变量) 。这是@interface实例变量的默认可访问性。

@implementation中定义的实例变量对于该实现是私有的,除了,接口构建器可以访问它们。

现在上面的“拥有类”这个短语意味着“拥有类的任何实例”。因此,例如,如果您有两个不同的同一个类的实例,他们可以访问彼此的私有实例变量。其中一个实例可以访问其他父级的受保护变量。等等。换句话说,protected和private适用于所有类实例的“族”,而不适用于单个对象实例。

所以对你的问题的简单回答是:是的,孩子可以访问其父母的公共和受保护的实例变量。

但是在你的问题中,你有一个方法在父母创建一个新的孩子,然后调用该孩子的方法,你问它可以访问父母吗?但你的意思是哪个“父母”?创建子节点后,有两个父实例,调用父方法的原始实例,以及刚刚创建的子对象的一个​​实例。两个父对象意味着两组父实例变量,您试图访问哪一组?

新创建的子项可以使用self访问其父实例变量。它具有权限来访问创建它的父对象的实例变量,但是为了使用这些权限,它需要引用来创建父对象。在您的代码示例中,没有对创建父项的引用传递给子项,因此答案是:no,您的子项无法访问其创建父项的实例变量,直到它被传递给该创建者的引用。

评论跟进

您可以将创建实例作为初始化的一部分。 E.g:

@interface CHILDCLASS
{
    PARENTCLASS *myCreator;
}
...
@end

@implementation CHILDCLASS

- (id) initWithCreator:(PARENTCLASS *)_myCreator
{
   if((self = [super init]))
   {
      myCreator = _myCreator;
   }
   return self;
}

- (void) doSomething
{
   NSLog("My parent's something: %@", something);
   NSLog("My creator's something: %@", myCreator->something);
}

这是“好习惯”吗? 本身没有任何错误,其实例具有对其创建实例的引用,因此它不是“不好的做法”。但是,我确实想知道在这种情况下是否存在对继承的一些混淆。目前尚不清楚为什么您希望访问创建子项的父实例的实例变量而不是父项实例变量?这样做没有错误,但是根据目前的细节,我不能说你正在做的事情也是“好”。