【发布时间】:2018-03-01 20:49:10
【问题描述】:
我最近正在开发一个 iphone 应用程序,我觉得使用继承可以使结构更加合理和优雅。但是,我正在为继承如何在 objc 中工作而苦苦挣扎。 Java 中的继承约定在这里似乎不起作用。
情况:
这可能有点复杂,但这看起来是描述这种情况的最佳方式。假设我有 2 个班级,A 和 B。它们如下所示:
// Class A
@interface A: B
@end
@implementation A
- (id)init{
self = [super init];
if(self){
}
return self;
}
@end
// Class B
@interface B: NSObject
@property A *littleA;
- (void)doSomething;
- (void)blabla;
@end
@implementation B
- (id) init {
self = [super init];
if(self) {
_littlea = [[A alloc] init]; // error: No known class method for selector 'alloc'
}
return self;
}
- (void)doSomething{
NSLog(@"something");
}
- (void)blabla{
[littleA doSomething]; // error: No visible @interface for 'A' declares the selector 'doSomething:'
}
@end
在这些类之外,还有一个 C 类。在 B 类中,我将“littleA”传递给 C 类的方法。在那种方法中,我做到了:
[littleA isEqual:NULL];// error: No visible @interface for 'A' declares the selector
我完全被这些错误信息弄糊涂了。这是继承应该做的吗?在Java中,A扩展B,B扩展C,然后我可以从A调用:a.b的方法或a.c的方法。
我做错了什么?任何人都可以解释这三个错误消息将是一个很大的帮助!
【问题讨论】:
-
这是您的代码的复制粘贴吗?如果是这样,您是否也收到有关"interface type cannot be statically allocated" 的警告?
-
提示:
@property A* littleA;(注意指针)Objective-C 对象不能“静态”分配。换句话说,你永远不可能有一个包含整个对象的变量;您只能声明一个包含对对象的引用的变量。 -
@Josh Caswell 和 James Bucanek 感谢您指出这一点。不幸的是,这是我在问题中的错字。我的所有对象属性都有 * 。我已经修复了问题中的代码。但是了解静态分配对象是件好事。我只知道指针和引用的区别,不知道它们是如何分配的:)
-
第一行
@interface A: B没有出错?此外,您是否知道A是子类,而不是B?您可能应该将示例代码中的类重命名为BaseClass和Subclass以使其更具可读性。此代码不是您的真实代码,您可能忘记导入A。
标签: objective-c xcode inheritance