我不确定最雄辩的方式来说明这一点,但我会尽力而为。我创建了一个自定义类,它是具有一些属性的通用对象。我创建了几个子类来扩展它并使它们比超类更具体。所以为了举例,我将抛出一些通用的示例代码,这些代码可能是也可能不是正确的语法,只是为了说明我想要完成的事情。
@interface Vehicle : NSObject
@property (nonatomic) int wheels;
- (id)initWithNumberOfWheels:(int)wheels;
@end
从那里我为相同的“汽车”和“卡车”创建了一些子类,为课程提供了更多细节。
@interface Car : Vehicle
@property (nonatomic) BOOL convertible;
@property etc...
@end
和...
@interface Truck : Vehicle
@property (nonatomic) BOOL is4x4;
@property (nonatomic) int numberOfDoors;
@end
所以这就是有趣的地方。我想创建另一个分配这些对象的类,但我希望在 init 方法中确定车辆的“类型”,但使用相同的 @property 变量。例如(再一次,这都是垃圾代码,只是为了提供视觉表示)
路.h
#import "Car.h"
#import "Truck.h"
@interface Road : NSObject
@property (strong, nonatomic) NotSureWhatToUseHereToMakeThisWork *myRide;
// doesn't work: @property (strong, nonatomic) id myRide;
// doesn't work: @property (strong, nonatomic) Vehicle *myRide;
- (id)initWithCars;
- (id)initWithTrucks;
@end
路.m
@implementation Road
- (id)initWithCars
{
//standard init code...
myRide = [[Car alloc] initWithNumberOfWheels:4];
myRide.convertable = NO;
}
- (id)initWithTrucks
{
//standard init code...
myRide = [[Truck alloc] initWithNumberOfWheels:6];
//yes, some trucks have more than 4 wheels
myRide.is4x4 = YES;
}
@end
底线是如果我在@property 中使用超类,它显然不会获得子类属性。基本上我想让所有这些尽可能通用和可重用。从那以后就没有为汽车和卡车制作一个特殊的“道路”课程。路终究是路。有什么可以做我所追求的吗?有没有更好的方法来做这样的事情?主要目的是让对象仅在特定情况下继承特定属性。我不想制作额外的@properties 的原因是,如果它们不适用于这种情况,我不希望它们可见。
编辑:我添加了一些额外的片段来显示我在发布这个不起作用的问题之前尝试过的内容。
答案:如果有人好奇,正确的“答案”位于 CRD 在“附录”中的回复中。这样做的原因是“id”类型只能调用方法而不能继承属性。因此,解决方法(我是这样说的,因为我正在研究这个,得出的结论是这不是好的编程,如果可能的话应该避免)是使用访问器方法来获取/设置属性。
id mySomethingObject = [[SomeClass alloc] init...];
[mySomethingObject setPropertyMethod]...; //sets value
[mySomethingObject propertyMethod]...; //gets value
而不是试图使用...
mySomethingObject.property = ; //set
mySomethingObject.property; //get
如正确答案中所述,如果您分配“id”的类不响应该方法,您的程序将崩溃。