2012-06-13 124 views
3

铛报告,Test1(FooBar)不实现foobar,实现它尽管在FOO和Test1(Foo)bar正在实施中Test1正在实施。由于Test1(Foo)@interface存在于Test1(FooBar)之上,所以叮当应该看到Test1(Foo)实施了foo并且不应该要求我在Test1(FooBar)中实现它。由于Test1 implements bar,clang不应该要求我在Test1(FooBar)中实现它。声明符合目标c协议与一个类别,并与另一类别

@interface Test1 : NSObject 

- (void) bar; 

@end 

@interface Test1(Foo) 

- (void) foo; 

@end 

@protocol FooBar <NSObject> 

- (void) foo; 
- (void) bar; 

@end 

@interface Test1(FooBar)<FooBar> 

@end 

@implementation Test1(Foo) 

- (void) foo { 
} 

@end 

@implementation Test1(FooBar) 

@end 

回答

1

我的理解是,这条线:

@interface Test1(FooBar)<FooBar> 

可以用简单的英语解释为 “ FooBar的阶级的Test1应该实现协议FooBar的”。换句话说,协议适用于类别,而不是类别。

+1

类别在运行时有效地折叠到类中;在类别和类之间没有区别,实际上(事实上,在运行时没有办法通过名称来识别类别 - 您可以做的最多的是通过方法列表进行grub,以注意来自类别的方法通常存储在与主类的方法不同的链表)。在编译期间,类仍然有意义,因此,我希望这意味着'Test1(FooBar)'的实现必须实现''的合约来保持编译器的安静。 – bbum

+0

@bbum感谢您的解释。我觉得编译器应该更聪明一些,并提出一个雷达。如果你将这个评论改为答案,我会将你的答案标记为答案。 –

+0

看起来你试图实现的是类之间的继承,作为一个概念在objective-c中不存在,无论它在运行时如何实现。 –

相关问题