2013-03-15 15 views
9

Ho un un'applicazione per iPhone in quale classe Un è una sottoclasse di UIViewController:Come posso ereditare una classe personalizzata da più superclassi?

enter image description here

Ora sto creando una nuova applicazione, in cui voglio riutilizzare A, ma ce l'ha sottoclasse da B, che va bene, perché B sottoclassi da UIViewController:

enter image description here

Ma ora ho un'altra classe, C, che è una sottoclasse di GLKViewController:

enter image description here

Il problema viene quando provo a fare una terza applicazione che ri- utilizza B senza alcuna modifica. Dal momento che B eredita da UIViewController, ho bisogno di dire in qualche modo C che dovrebbe ereditare da Be daGLKViewController, che credo sia un caso di ereditarietà multipla:

enter image description here

Da quello che sto leggendo, il modo migliore per gestire questo è con composizione, ma non capisco come applicarlo al meglio alla mia situazione n.

come soluzione stand-in, ho capito che potevo basta creare un involucro classe D cui posso quindi modificare su base app-by-app per creare una sottoclasse dalla superclasse appropriata per il compito a portata di mano:

enter image description here

enter image description here

Ma che sembra tipo di hacky. C'è un modo migliore per farlo?

+0

Che cos'è un UIScrollViewController? – jrturton

+1

Che ne dici di usare una categoria su UIViewController invece di suddividerla in sottoclasse? Poiché UIScrollViewController eredita da UIViewController, la tua categoria sarebbe utilizzabile anche in caso di istanze di UIScrollViewController. Ow, e davvero ben formulata domanda +1 per quello! – Till

+3

non è possibile farlo in Objective-C è single inheritance - come java usa un paradigma di composizione o delega –

risposta

7

L'obiettivo C supporta solo l'ereditarietà singola. In questo caso, probabilmente vorrai utilizzare i protocolli per funzionalità comuni. È possibile utilizzare un oggetto helper per implementare i metodi del protocollo. In questo caso, non sei interessato a sapere se il tuo oggetto è membro di una particolare classe, ma se implementa uno specifico insieme di metodi.

+1

Sono curioso su quale classe ti riferisci quando dici "non ti interessa sapere se il tuo oggetto è membro di una particolare classe" - l'UIViewController o B?Perché sono abbastanza sicuro di essere interessato a far parte di entrambe le classi, sia in termini di accesso a variabili e metodi di istanza. – todd412

+0

Corretti, i protocolli consentono funzionalità simili all'ereditarietà multipla. Sfortunatamente, non consentono implementazioni predefinite che spesso portano a soluzioni di duplicazione del codice un po 'meno eleganti che si basano su cluster di classe (oggetti helper, come li chiamano). In ogni caso, dal punto di vista esterno che potrebbe essere un ottimo sostituto. – Till

3

non è possibile farlo in Objective-C è un'ereditarietà singola - come Java o la maggior parte delle altre lingue moderne.

uso un paradigma di composizione o di delegazione

+0

risolto - ios rimosso dal commento –

+1

... e ho rimosso il commento dal suono possibilmente aspro ...: D – Till

1

Si potrebbe ottenere quello coperto utilizzando una categoria. Certamente non è la stessa cosa dell'eredità multipla, ma a volte fa il lavoro.

Consentitemi di creare un esempio per una categoria e vedere se ciò fa ciò che si prefigge.

Intestazione: UIViewController+MyAwesomeExtension.h

@interface UIViewController (MyAwesomeExtension) 
- (void)doSomething; 
@end 

Implementazione: UIViewController+MyAwesomeExtension.m

@implementation UIViewController (MyAwesomeExtension) 
- (void)doSomething 
{ 
    NSLog(@"doing something totally awesome"); 
} 
@end 

Ora lo si utilizza all'interno di uno dei tuoi UIViewController sottoclassi che comprende anche, come ad esempio GLKViewController ...

Implementazione:

#import "UIViewController+MyAwesomeExtension.h" 
... 
[self.viewControllerDerivedClass doSomething]; 
... 

Nota che tale categoria ha i suoi limiti. Per saperne di più, che ne dici di approfondire la questione.


Nel complesso, penso che il "più" risposta corretta sarebbe utilizzando protocolli di avvicinarsi a ereditarietà multipla possibile, come Mike C. redatto nella sua risposta. La mia risposta è principalmente una soluzione per casi semplici.

+0

Grazie, non sono sicuro che una categoria farebbe il trucco qui- la mia classe A si affida a ereditando sia le variabili di istanza sia i metodi di istanza sia da B che da UIViewController (o GLKViewController) e A diventa anche il proprietario del file per un file .xib. Quindi non è chiaro se una categoria potrebbe fare tutte queste cose. – todd412

Problemi correlati