gpt4 book ai didi

iphone - Objective-C 子类问题

转载 作者:搜寻专家 更新时间:2023-10-30 20:01:58 24 4
gpt4 key购买 nike

我有一个名为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com