Tôi có cấu trúc đối tượng sau:Mục tiêu c isKindOfClass sai lầm?
Thú cưng, Chó và mèo. Như bạn mong đợi Chó và Mèo được thừa hưởng từ Động vật.
Và tôi đã là một lớp trang trại:
@implementation AnimalFarm
-(Animal*) createAnimal:(AnimalType)type{
switch (type) {
case CAT:
return [Cat new];
case DOG:
return [Dog new];
default:
return [Animal new];
}
}
@end
và tôi đã cố gắng để kiểm tra đơn vị:
AnimalFarm *farm = [AnimalFarm new];
Animal *dog = [farm createAnimal:DOG];
Animal *cat = [farm createAnimal:CAT];
STAssertTrue([cat isMemberOfClass:[Cat class]],@"cat is not a cat!");
STAssertTrue([dog isMemberOfClass:[Dog class]],@"Dog is not a dog!");
STAssertTrue([cat isKindOfClass:[Animal class]],@"Cat is not an animal!");
STAssertTrue([dog isKindOfClass:[Animal class]],@"Cat is not an animal!");
Thực hiện các lớp:
@interface Cat : Animal {
}
@end
@implementation Cat
-(NSString*) say{
return @"miau";
}
@end
thực hiện của con chó là tương tự.
nhưng không isKindOfClass hoặc isMemberOfClass làm việc như tôi mong đợi ....
Tôi có thiếu cái gì?
Khi tôi sử dụng IF thay vì chuyển đổi thì mọi thứ diễn ra tốt đẹp ... nhưng sự khác biệt là gì?
Thực hiện createAnimal mà hoạt động:
-(Animal *) createAnimal:(AnimalType)type {
if (type == DOG) {
return [Dog new];
} else if (type == CAT) {
return [Cat new];
} else {
return [Animal new];
}
Để làm rõ: Cả hai 'isMemberOfClass:' và 'isKindOfClass:' đang trả về NO trong các ví dụ đó? – Chuck
Và bạn có nhận được bất kỳ cảnh báo nào trong quá trình biên dịch không? – Chuck
Chúng ta có thể thấy định nghĩa 'CAT' và' DOG' không? Ngoài ra, những gì bạn có nghĩa là "không làm việc như tôi mong đợi"? Kết quả của xác nhận là gì? – Tim