目标C策略创建动态对象

时间:2012-05-19 15:45:27

标签: objective-c oop dynamic

我有一个名为City的超类和一系列继承自此类的子类。例如伦敦和纽约。每个子类都有自己独特的方法和实例变量。

当我的应用程序启动时,我对当前位置进行地理编码并根据我当前所在的城市实例化子类。

现在我定义了多个属性来访问这些类,所以

@property (nonatomic, strong) London *london;
@property (nonatomic, strong) NewYork *newYork;
...
...

我在任何时候都只需要一个这种类型的对象,所以只能定义一个属性来访问这个对象。像

这样的东西
@property (nonatomic, strong) City *city;

有没有办法可以动态创建我需要的子类而不必声明多个属性?

2 个答案:

答案 0 :(得分:2)

你绝对可以在Objective-C中实现子类。您可以执行以下操作来实例化城市:

self.city = [[NewYork alloc] init];

调用特定于城市的方法:

if ([self.city isKindOfClass:[NewYork class]])
{
      // call some NewYork methods e.g..
      [(NewYork *)self.city doNewYorkThing];
}
else if ([self.city isKindOfClass:[London class]])
{
      // call some London methods e.g.
      [(London *)self.city doLondonThing];
}

方法“isKindOfClass:”,“isMemberOfClass:”,“conformsToProtocol:”和“respondsToSelector:”是您熟悉的有用的类方法。

答案 1 :(得分:1)

“动态”是一个灵活的概念。 :)你当然可以写一些像......

self.city = [[London alloc] init];

...然后使用City中定义的任何方法。如果London定义了自己的实现,您将获得这些方法的重写版本。如果您确实知道它是伦敦对象,您也可以这样做:

[(London *)city somethingSpecial];