我有一个名为City的超类和一系列继承自此类的子类。例如伦敦和纽约。每个子类都有自己独特的方法和实例变量。
当我的应用程序启动时,我对当前位置进行地理编码并根据我当前所在的城市实例化子类。
现在我定义了多个属性来访问这些类,所以
@property (nonatomic, strong) London *london;
@property (nonatomic, strong) NewYork *newYork;
...
...
我在任何时候都只需要一个这种类型的对象,所以只能定义一个属性来访问这个对象。像
这样的东西@property (nonatomic, strong) City *city;
有没有办法可以动态创建我需要的子类而不必声明多个属性?
答案 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];