我想要一个实例变量对象来采用协议。

@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
    Layer *content <CocosNodeOpacity>;
}

例如,我希望我的Layer对象采用<CocosNodeOpacity>以便我可以获取方法

-(GLubyte) opacity;    //and
-(void) setOpacity: (GLubyte) opacity;

免费。上面显示的语法无效。是否可以在不创建新实现文件和创建自定义对象的情况下实现此目的?感谢。

有帮助吗?

解决方案

如果这些都是您创建的代码,那么最好的方法就是让Layer类本身采用协议而不是变量。

@interface Layer : NSObject <CocosNodeOpacity> { ... }

这种方法的一个主要好处是编译器将检查您是否在编译时在协议中实现了所有必需的方法,这通常是您想要的。在与标准类实现的其余部分相同的位置添加方法更容易理解(没有找到魔法代码来自哪里)并且比使用类别更不易碎(通过不同类别添加相同的方法可能导致未定义的行为) 。作为一般规则,我只在拥有时使用类别,例如向(闭源)第三方代码添加方法。

如果你不控制id的来源,你可能必须在宣布你的ivar时使用它:

Layer<CocosNodeOpacity> *content;

请注意,采用协议允许您使用类类型静态键入变量,并在方法不存在时获取编译警告。但是,由于仍需要实现它们,因此无法获得<!>“;免费<!>”的方法。但是,明智地使用协议和静态类型可以使您的代码更加健壮,并且<!>“fail-fast <!>”;而不是使用 <=> 作为一切的类型。不仅仅是采取简单的方法,你将受到赞扬。 : - )

有关协议的一些详细信息(包括必需和可选方法),请参阅此SO答案

其他提示

Objective-C中的协议类似于Java中的接口。该协议定义了一组函数并充当契约。这就像说<!>;我保证无论这个对象是什么,它都有这些方法。<!>

您在第一个代码块中的语法非常接近。它实际上看起来像这样:

@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
    Layer<CocosNodeOpacity> * content;
}

但是,这不会使您不必在Layer类中定义不透明度的方法。使用该协议,您已经确定您的类将具有这些功能,但您实际上并未提供它们。你仍然需要为它们编写代码。

我认为您正在寻找的是Objective-C类别。类提供了一种通过在运行时向其添加方法来扩展任何类的功能的方法。它们是可能的,因为Objective-C是一种完全动态的语言。如果您不是Layer类的作者,并且无法轻松地向其添加不透明度方法,则可以使用类别。在某些情况下,类别非常有用 - 您可以在没有现有类源的情况下向内置类添加方法,如NSString和NSColor。

这里有关于堆栈溢出的类别的大量文档。苹果文档也很好。这是一篇可以帮助您入门的文章:

http://macdevelopertips.com/objective-c/objective-c -categories.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top