わかった。ここで、最良の出発点を見つけるのは難しい。LionのエラーXCode(4.3.2)は、次のとおりです。
Redefinition of 'a' with a different type
著者は、この行を宣言すると(このページの下部近く、メインで)...
OwnedAppliance *a = [[OwnedAppliance alloc] init];
...正常に動作するはずです。そうではありません。上記のエラーをキックバックします。OwnedApplianceの実装にはinitメソッドがないため、コンパイラーは階層を上って、OwnedApplianceのスーパークラスであるApplianceに移動し、そこでinitメソッドを検索することを理解しています。次の行のみを含むオーバーライドされたinitを検出します...
[self initWithProductName:@"Unknown"];
...そしてそれを実行します。了解した。
うーん。すみません、みんな。何が起こっているのかを説明しようとしました。十数行かかり、表面を引っかいただけでした。私が起こっていると思うことであなたを退屈させるのではなく、私はただ尋ねます:
このコードで何が起こっているのですか?より良い用語がないため、初期化の「パス」はどこで終了しますか?再定義(エラー)はどこで発生しますか?
/******************** Appliance.h ********************/
#import <Foundation/Foundation.h>
@interface Appliance : NSObject
{
NSString *productName;
int voltage;
}
@property (copy) NSString *productName;
@property int voltage;
-(id)init;
// Designated initializer
-(id)initWithProductName:(NSString *)pn;
...
@end
/******************** Appliance.m ********************/
#import "Appliance.h"
@implementation Appliance
@synthesize productName, voltage;
-(id)init
{
return [self initWithProductName:@"Unknown"];
}
-(id)initWithProductName:(NSString *)pn
{
self = [super init];
if (self) {
[self setProductName: pn];
[self setVoltage: 120];
}
return self;
...
@end
/******************** OwnedAppliance.h ********************/
#import "Appliance.h"
@interface OwnedAppliance : Appliance
{
NSMutableSet *ownerNames;
}
// Designated initializer
-(id)initWithProductName:(NSString *)pn
firstOwnerName:(NSString *)n;
...
@end
/******************** OwnedAppliance.m ********************/
#import "OwnedAppliance.h"
@implementation OwnedAppliance
-(id)initWithProductName:(NSString *)pn
firstOwnerName:(NSString *)n
{
self = [super initWithProductName:pn];
if (self) {
ownerNames = [[NSMutableSet alloc] init];
if (n) {
[ownerNames addObject:n];
}
}
return self;
}
-(id)initWithProductName:(NSString *)pn
{
return [self initWithProductName:pn
firstOwnerName:nil];
}
...
@end
/******************** main.m ********************/
#import <Foundation/Foundation.h>
#import "Appliance.h"
#import "OwnedAppliance.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// Previously omitted problematic code:
Appliance *a = [[Appliance alloc] init];
NSLog(@"a is %@", a);
[a setProductName:@"Washing Machine"];
[a setVoltage:240];
NSLog(@"a is %@", a);
// The following line is where the error occurs:
OwnedAppliance *a = [[OwnedAppliance alloc] init];
...
}
return 0;
}
私はこの質問とそれを尋ねる方法についてたくさん考えました。ひどく馬鹿げているとは思いません。:)しかし、私の脳はこのようなものを9時間勉強してから揚げられているので、これが完全に明白な質問であるかどうかをお詫びします。TIA
編集:main()には、実際にエラーを引き起こしていたコードが含まれるようになりました。省略されているにもかかわらず、それを捕まえるのに十分なほど良いジャックに感謝します。