herencia múltiple en el objetivo C [duplicado]

Posible duplicado:
Herencia múltiple de Objective C

Hola,

Objective C no admite herencia múltiple. Estoy portando el código cpp a Objective C

¿Cómo declarar esta definición en el objetivo C?

class A:protected B,protected C
{
  //stmts;
}

@interface A:protected B,protected C
{
}
@end

no es posible.

preguntado el 10 de mayo de 11 a las 14:05

2 Respuestas

Objective-C no admite herencia múltiple, por lo que esto no es posible.

La herencia es un "es un" relación, una clase solo puede tener una es un Relación por herencia. Puedes tener varios es un relaciones a través de protocolos (interfaces en Java o C # parlace, o clase completamente abstracta en C ++).

En lugar de un es un relación puedes modelar una "tiene un" relación. Cualquier objeto puede tener cualquier número de tiene un relaciones. En la práctica, solo necesita tener una variable de instancia de cada clase que desee. Por ejemplo:

@interface A : NSObject {
  @private
    B* _b;
    C* _c;
}
// ... stuff
@end

Deberá volver a implementar todos los métodos de B y C y llamar a las variables de instancia contenidas según sea necesario. Si por ejemplo B implementos theAnswer entonces también debes implementarlo en A como:

-(int)theAnswer {
    return [_b theAnswer];
}

Es engorroso, pero esto es lo que debe hacer cuando la herencia múltiple real no está disponible.

contestado el 10 de mayo de 11 a las 19:05

Gracias por hacerme entender spandana

No.

No solo eso, todas las superclases son equivalentes a las clases públicas en C ++.

En Objective-C no usamos la herencia tanto como en los lenguajes similares a C ++, tendemos a usar más la composición. Por ejemplo, si tiene una colección similar a una matriz, normalmente no tendrá una subclase NSArray, creará una nueva clase que posiblemente use un NSArray como su "tienda de respaldo".

Hay trucos que puede hacer para reenviar mensajes a los que su nueva clase no responde a su variable de instancia NSArray. Por ejemplo, puede anular:forwardingTargetForSelector: para que los mensajes a los que su objeto no responda se reenvíen al NSArray subyacente. Si lo piensa, puede implementar un truco de herencia múltiple hecho en casa con esto.

editar

Un ejemplo:

Si tiene una clase que proporciona una matriz como funcionalidad de colección y desea todas los métodos NSArray, puede hacer esto:

@interface MyClass : NSObject
{
@private
    NSArray* backingArray;
}

// declarations of your methods

@end

@implementation MyClass

// implementations for your methods + initialisation

-(id) forwardingTargetForSelector: (SEL) aSelector
{
    return backingArray;
}

@end

En realidad, nunca ve un código como este para casos simples: la gente siempre usa categoría. Si desea emular la herencia múltiple con este truco, necesita una variable de instancia para cada clase "heredada" y el método -forwardingTargetForSelector: necesita algo de lógica basada en el selector para decidir qué objeto devolver. Esto será bastante lento, por lo que puede optimizar los selectores más utilizados implementándolos directamente según la respuesta de PeyloW.

contestado el 10 de mayo de 11 a las 18:05

Esta es una solicitud. ¿Puede explicarme con un código de ejemplo? Podría leer el enlace. Pero, ¿podría explicarme con un código de ejemplo? - spandana

@ JeremyP. Gracias por explicar en detalle para un principiante como yo. - spandana

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.