我有一个名为 Level 的类,它是 NSObject 的子类。
然后我有一个名为 Level_1_1 的类,它是 Level 的子类。
是否允许打字
Level* aLevel = [Level_1_1 alloc];
代替
Level_1_1* theLevel = [Level_1_1 alloc];
? :)
我尝试了一下,但没有收到任何警告,只是想知道是否可以这样做?
最佳答案
这是允许的;但有两件事你应该记住:
- 永远不要调用
+alloc
而不将它与-init
或-initWith*
链接起来,除非你正在处理运行时. - 如果您正在调用类似
Level_1_1
的类,您可能需要重新考虑您的设计。例如,您可能希望拥有一个通用的Level
类以及与之关联的某种级别描述数据,这样您就不必对每个级别都进行硬编码;如果您不付出大量努力,几乎不可能扩展东西。
回到正题:
SomeClass *aSomeclass = [[MySomeClass alloc] init];
是完全可以接受的(假设 MySomeClass
继承自 SomeClass
)。事实上,这种情况经常发生而你甚至没有注意到:例如,你永远不会真正得到一个 NSString
,即使在调用 [[NSString alloc] init]
时,如:
// This is an NSConstString masquerading as an NSString
NSString *aString = @"This is an NSConstString";
// This probably gives you an NSConcreteString, or something of the kind
NSString *anotherString = [NSString stringWithString:aString];
您甚至可以将完全错误的类型添加到您的类中。例如
NSArray *someString = @"Not An Array!";
NSLog(@"%s", [someString UTF8String]); // this works, but creates
// a compile-time warning
NSLog(@"%u", [someString count]); // this creates a runtime error,
// but none while compiling
这个字符串实例仍然完全可用,但是编译器不能再警告你明显的错误,因为它认为它是一个 NSArray。另外,Objective-C 2.0 属性将无法正常工作(但编译器会警告您。)。
关于iphone - Objective-C 子类问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2635902/