iphone - Objective-C 子类问题

标签 iphone objective-c subclass

我有一个名为 Level 的类,它是 NSObject 的子类。

然后我有一个名为 Level_1_1 的类,它是 Level 的子类。

是否允许打字

Level* aLevel = [Level_1_1 alloc];

代替

Level_1_1* theLevel = [Level_1_1 alloc];

? :)

我尝试了一下,但没有收到任何警告,只是想知道是否可以这样做?

最佳答案

这是允许的;但有两件事你应该记住:

  1. 永远不要调用 +alloc 而不将它与 -init-initWith* 链接起来,除非你正在处理运行时.
  2. 如果您正在调用类似 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/

相关文章:

iPhone:如何将 UITextField 和 UITableView 放在同一个 View 上?推荐方式

ios - 具有两个不同自定义单元格的 UITableview 在滚动时重叠

iphone - UIDevice currentDevice 的 "orientation"始终为 null

c++ - 从 C++ 访问 objective-c

ios - 监视NSNotifications

c++ - 定义子类 (c++)

javascript - 具有默认值的 JS 子类

iPhone 操作系统 : how to programmatically differentiate iPad 3G from iPad Wi-Fi?

iOS 10.1 , tabbar出现黑线

java - 我想使用在父类(super class)中创建的数组中的子类中的字段