子类和 “促进” 对象
我有一个类:子类和 “促进” 对象
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 ? (这是零)。我做错了什么?这是一个正确的设计?
或者,你可以避开这整个图案过于聪明,并创建返回无论是BasicObject
或AdvObject
根据传递给它的参数类工厂方法。
类工厂?我有许多对象不只是两个类(我简化了问题)。你能告诉我更多关于它吗?据我了解,我会创建一个抽象类,它应该创建许多对象。但我真的不知道如何在objective-c中做到这一点。我不知道iOS中有这样的解决方案。 – Kuba
它不是iOS特有的,只是一个类方法,比如'+(id)objectForParameter:(NSString *)selector;'。在里面,它创建并返回选择器指示的任何类型的对象。当然,“选择器”可以像你需要的那样复杂......例如字典。如果方法的返回值是一个基类或一个带有协议而不是裸号的id,那么调用者也会更容易,但这是细节。 –
谢谢!这非常有帮助。 – 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尝试这样做,所以你需要仔细进行测试。
你应该几乎永远不会在初始化器中返回'self'或'nil'以外的东西。它将ARC发送到地狱洞,并将遗忘的引用代码。花费了很多很多时间来调试上面写得不好的代码。如果你需要返回一个不同类的对象,可以在'alloc'中执行。 –
谢谢,我会记住的。但''alloc'我认为不适合我。我有一个对象,如果该对象满足条件,它必须成为另一个对象。如何实现这一目标? – Kuba
对于'+ alloc' +1。这是类集群的工作方式。 –