子类和 “促进” 对象

问题描述:

我有一个类:子类和 “促进” 对象

BasicObject : NSObject 

AdvObject : BasicObject 
其他类

我通过做一个实例:

BasicObject *bObj = [[BasicObject alloc] initWithSomething:propertyOne andSomethingElse:propertyTwo]; 

BasicObject具有两个特性:

@interface BasicObject : NSObject 

-(id)initWithSomething:propertyOne andSomethingElse:propertyTwo; 

@property (strong,nonatomic) NSString* propertyOne; 
@property (strong,nonatomic) NSArray* propertyTwo; 

而且然后在初始化程序中:

-(id)initWithSomething:propertyOne andSomethingElse:propertyTwo 
{ 
    if (self = [super init]) 
    { 
     _propertyOne = propertyOne; 
     _propertyTwo = propertyTwo; 

     if(!propertyTwo) //this is not valid condition i know, not important here 
      { 
      AdvObject *aObj = [[AdvObject alloc] initWithBasic:self]; //here it what i'm more concern about 
      return aObj; 
      } 
    } 

    return self; 
} 

所以在AdvObject班上有在初始化我有:

@implementation AdvObject 

@synthesize basics = _basics; 


-(id)initWithBasic:(BasicObject *)bObj 
{ 
    if(self = [super init]) { 
     _basics = bObj; 
    } 

    return self; 
} 

而在这之后,当我回到这个对象当然我有一个object.basics正确填写,但为什么我不能访问object.propertyOne ? (这是零)。我做错了什么?这是一个正确的设计?

+2

你应该几乎永远不会在初始化器中返回'self'或'nil'以外的东西。它将ARC发送到地狱洞,并将遗忘的引用代码。花费了很多很多时间来调试上面写得不好的代码。如果你需要返回一个不同类的对象,可以在'alloc'中执行。 –

+0

谢谢,我会记住的。但''alloc'我认为不适合我。我有一个对象,如果该对象满足条件,它必须成为另一个对象。如何实现这一目标? – Kuba

+0

对于'+ alloc' +1。这是类集群的工作方式。 –

或者,你可以避开这整个图案过于聪明,并创建返回无论是BasicObjectAdvObject根据传递给它的参数类工厂方法。

+0

类工厂?我有许多对象不只是两个类(我简化了问题)。你能告诉我更多关于它吗?据我了解,我会创建一个抽象类,它应该创建许多对象。但我真的不知道如何在objective-c中做到这一点。我不知道iOS中有这样的解决方案。 – Kuba

+0

它不是iOS特有的,只是一个类方法,比如'+(id)objectForParameter:(NSString *)selector;'。在里面,它创建并返回选择器指示的任何类型的对象。当然,“选择器”可以像你需要的那样复杂......例如字典。如果方法的返回值是一个基类或一个带有协议而不是裸号的id,那么调用者也会更容易,但这是细节。 –

+0

谢谢!这非常有帮助。 – Kuba

init...方法需要做两件事不同,如下图所示:

- (id)initWithSomething:propertyOne andSomethingElse:propertyTwo 
{ 
    if (self = [super init]) 
    { 
     if (!propertyTwo) 
     { 
      self = [[AdvObject alloc] initWithBasic:self]; 
     } 

     _propertyOne = propertyOne; 
     _propertyTwo = propertyTwo; 
    } 

    return self; 
} 

我还没有实际使用ARC尝试这样做,所以你需要仔细进行测试。