これを最も雄弁に述べる方法はわかりませんが、最善を尽くします。いくつかのプロパティを持つ汎用オブジェクトであるカスタム クラスを作成しました。それを拡張し、スーパークラスよりも具体的にするために、いくつかのサブクラスを作成しました。そのため、例として、私が達成したいことを説明するためだけに、適切な構文である場合とそうでない場合があるいくつかの一般的なサンプル コードをスローします。
@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 変数を使用します。たとえば(繰り返しますが、これは視覚的に表現するためだけのガベージ コードです)。
Road.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
Road.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」を割り当てたクラスがそのメソッドに応答しない場合、プログラムはクラッシュします。