2010-03-06 15 views
20

¿Puede una interfaz Objective c tener más de una implementación? Ejemplo: podría tener una interfaz pero 2 implementaciones, una en la que utilizo una matriz u otra en la que utilizo una pila ... etc para implementarla.¿Puede una interfaz Objective c tener más de una implementación?

En caso afirmativo, ¿cómo se llama/sintaxis?

+0

¿Qué le parece usar "Protocolos"? Está más cerca de las interfaces java/C#. ¿Qué es lo que quiero? – user48545

Respuesta

25

de Objective-C tiene el concepto de un Protocolo, que es la especificación de una interfaz. A través de Protocolos, Objective-C admite completamente la herencia múltiple de la especificación (pero no la implementación). Entonces, un poco confuso, la sintaxis @interface realmente define la clase (implementación), que solo admite la herencia simple, pero puede especificar la implementación de la herencia muchos/múltiples de Protocolos, o las especificaciones de las interfaces. Al final, esto es muy similar en naturaleza a Java.

Por ejemplo:

@protocol SomeInterface 
- (void)interfaceMethod1; 
- (void)interfaceMethod2; 
@end 

@interface SomeClass:NSObject <SomeInterface> 
@end 

@interface AnotherClass:NSObject <SomeInterface> 
@end 

instancias de cualquiera de SomeClass o AnotherClass tanto afirman que proporcionan la aplicación requerida para la SomeInterfaceprotocolo.

Objective-C se tipea dinámicamente y no requiere que el objeto realmente especifique el mensaje que se le envía. En otras palabras, se puede indiscriminadamente llamar a cualquier método que le gustaría en SomeClass, si se especifica en que es interfaz o cualquiera de sus protocolos o no (esto no sería necesariamente una cosa productivo o positivo que hacer)

Por lo tanto, se compilará todo lo siguiente (aunque con advertencias) y se ejecutará correctamente, aunque los mensajes/métodos sin implementación son básicamente no operativos en este caso. Objective-C tiene un proceso bastante complicado (y muy bueno) de manejo de llamadas/reenvíos que está un poco fuera del alcance de esta pregunta.

SomeClass * someObject = [[SomeClass alloc] init; 
[someObject someUnspecifiedMethod]; // Compiles with warning - no op 
[someObject interfaceMethod1]; 

Si desea definir algo que puede ser de cualquier clase (@interface) tipo, pero implementa una interfaz específica (@protocol), se puede usar algo como esto:

id <SomeInterface> obj; 

obj podría contener un objeto SomeClass o AnotherClass.

+0

Tienes razón ... Respondí una pregunta mucho más "básica" (y no realmente la que el OP estaba haciendo) ... después de volver a leer, puedo ver que el OP probablemente estaba buscando algo más acorde con su respuesta/fábricas abstractas/clusters de clase. – rcw3

3

¿Quiere decir, por ejemplo, así:

@interface MasterViewController : 
    UIViewController <GKPeerPickerControllerDelegate, 
        GKSessionDelegate, 
        UITextFieldDelegate, 
        UITableViewDelegate, 
        AVAudioRecorderDelegate> { 
} 
+0

¿O realmente se refiere a más de un @ implementación/@ end block? –

+0

Encontré esto buscando la manera de declarar múltiples delegados sin crear clases e implementaciones separadas. Esto funcionó perfectamente. Gracias 2 años después. –

24

Quizás deberías intentar el patrón de cacao llamado Class Cluster. Para comenzar a usarlo, debe crear una clase pública llamada SomeClass y dos subclases privadas SomeArrayClass y SomeStackClass. Cuando necesite usar la pila, su constructor de clase pública creará una instancia de SomeStackClass y la devolverá como instancia públicamente disponible de SomeClass.

+1

Este es exactamente el patrón que desea usar. – bbum

+0

¿Qué tal el uso de "Protocolos"? Está más cerca de las interfaces java/C#. Que es lo que quiero. – user48545

20

(Si le das este voto, por favor, dale un voto a Roman - su respuesta fue la primera, es correcta, solo le faltaba un ejemplo).

Usted está hablando un Class Cluster. Por ejemplo, mira la clase NSString.

No es NSString:

@interface NSString : NSObject 

Y NSMutableString:

@interface NSMutableString : NSString 

Ambos de los cuales declarar una extremadamente pequeño conjunto de métodos en la declaración de la clase principal. Si tuviera que subclase NSString para implementar su propia clase de cadena, , solo necesitaría implementar esos métodos centrales. Todos los demás métodos implementados en NSString se implementan en términos de los métodos centrales. Y, del mismo modo, los métodos de mutación se implementan utilizando los métodos primitivos declarados en el núcleo de NSMutableString.

Ahora, obviamente, implementar toda la mutabilidad a través de - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString (el método de un núcleo) sería extremadamente ineficiente. Por lo tanto, en tiempo de ejecución, observará que que en realidad nunca tiene una instancia de NSSutricion o NSMutableString, sino solo instancias de subclases (que, en realidad, no son realmente subclases ... pero que bien podrían estar en el contexto de esta discusión).

Y esas subclases, la clase de implementación utilizada en el tiempo de ejecución, anulan casi todos los métodos de NSString y NSMutableString para proporcionar implementaciones altamente optimizadas de las operaciones específicas.

lo tanto, usted haría algo como:

@interface MyAbstractClass : NSObject 
... declare factory methods here ... 
... declare core methods here ... 
@end 

@interface MyAbstractClass(AdditionalFunctionality) 
... declare convenience here ... 
@end 

Luego, en la puesta en práctica, implementar todos los métodos básicos como @throw @"Must use subclass" y todos AdditionalFunctionality métodos en cuanto a los métodos básicos.

Esto podría ser totalmente privada - no en un encabezado en absoluto, incluso:

@interface MyStackClass: MyAbstractClass @end

@implementation MyStackClass ... poner en práctica los métodos básicos y anular la métodos de funcionalidad adicional que necesitan optimización ... @end

Repita para sus clases adicionales de clases. Luego, implemente métodos de fábrica en MyAbstractClass que devuelvan instancias de las subclases, según sea necesario.

Cuestiones relacionadas