Цель C - Как я могу создать интерфейс? - PullRequest
5 голосов
/ 27 августа 2010

Мне нужно иметь возможность создавать интерфейс, подобный тому, который вы создаете в C #, для обеспечения применения группы классов для реализации определенных методов.Возможно ли это в цели c?

Ответы [ 4 ]

29 голосов
/ 27 августа 2010

Вы можете создать протокол. это будет выглядеть примерно так: в MyProtocol.h:

@protocol MyProtocol
-(void)myMethod;
-(void)myMethod2;
@end

в MyClass.h

#import "MyProtocol.h"
@interface MyClass : NSObject<MyProtocol>
@end

Если вы хотите получать объекты данного протокола, вы можете сделать это следующим образом:

id<MyProtocol> var;

или

NSObject<MyProtocol> *var;

подробнее здесь

8 голосов
/ 27 августа 2010

Вы объявляете «протокол» (интерфейсы Objective C), используя

@protocol MyProtocol <BaseProtocol1,...,BaseProtocolN>
//methods and properties
@end

, где <BaseProtocol> является необязательным и указывает, что MyProtocol «наследует» интерфейс BaseProtocol.Протокол NSObject полезен в этом контексте, поскольку он позволяет использовать

@protocol MyProtocol <NSObject>
//...
@end

, чтобы указать (при необходимости), что соответствующие экземпляры MyProtocol также имеют стандартные методы NSObject (например, -retain/-release и т. Д.).

Затем вы объявляете, что класс "соответствует" протоколу:

@interface MyClass : NSObject <MyProtocol,...,OtherProtocols>
{}

@end

И вы можете проверить, соответствует ли экземпляр протоколу:

id myInstance = ...; //some object instance

if([myInstance conformsToProtocol:@protocol(MyProtocol)]) {
  // myInstance conforms to MyProtocol
}

Вы можете дополнительно замолчать предупреждения компилятора, заявив, что переменная содержит экземпляры, соответствующие протоколу (обратите внимание, что динамическая природа Objective-C не позволяет компилятору проверить этот контракт, и вы все равно можете получить ошибки времени выполнения, назначив не- соответствие экземпляра переменной):

id<MyProtocol> o;

В этом случае компилятор будет жаловаться, если вы отправите [o retain] без MyProtocol в соответствии с протоколом NSObject.Вы можете отключить эти предупреждения, объявив MyProtocol как соответствующий NSObject, как описано выше, или разделив o как

NSObject<MyProtocol> o;

, так как NSObject не единственный корневой объект в Какао (то есть NSProxy не наследуется от NSObject), это не обязательно верно, что все экземпляры, соответствующие MyProtocol, также соответствуют NSObject.Если вы знаете, что они это делают, вы можете объявить MyProtocol соответствующим NSObject.

2 голосов
/ 27 августа 2010

В мире Objective-C интерфейсы называются «Протоколы»

Согласно Apple,

Protocols declare methods that can be implemented by any class. Protocols are useful in at least three situations:

To declare methods that others are expected to implement
To declare the interface to an object while concealing its class
To capture similarities among classes that are not hierarchically related

Итак, для объявления протокола вы можете:

@protocol SomeClassProtocol
- (void) do:(int) number something:(id) sender;
- (void) somethingElse;
@end

Чтобы реализовать протокол, вы должны:

@interface MyClass : NSObject <Protocol1, Protocol2, ..., ProtocolN>
@end

Проверить эту ссылку для официальной документации.

0 голосов
/ 27 августа 2010

Интерфейсы называются протоколами в Objective C

Если вы добавите класс в свой проект, у вас будет возможность создать его как протокол, и вы получите что-то вроде:

@protocol MyProtocol
-(void) DoSomething;
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...