Objective-C-Mehrfachvererbung


88

Ich habe 2 Klassen, eine enthält Methode A und die andere enthält Methode B. In einer neuen Klasse muss ich also die Methoden methodA und methodB überschreiben. Wie erreiche ich eine Mehrfachvererbung in Ziel C? Ich bin ein bisschen verwirrt mit der Syntax.

Antworten:


136

Objective-C unterstützt keine Mehrfachvererbung und Sie benötigen sie nicht. Zusammensetzung verwenden:

@interface ClassA : NSObject {
}

-(void)methodA;

@end

@interface ClassB : NSObject {
}

-(void)methodB;

@end

@interface MyClass : NSObject {
  ClassA *a;
  ClassB *b;
}

-(id)initWithA:(ClassA *)anA b:(ClassB *)aB;

-(void)methodA;
-(void)methodB;

@end

Jetzt müssen Sie nur noch die Methode auf dem entsprechenden ivar aufrufen. Es ist mehr Code, aber in Objective-C gibt es keine Mehrfachvererbung als Sprachfunktion.


8
Komposition ist sehr oft ein besserer Ansatz als Vererbung, insbesondere wenn Sie viele Unit-Tests für den Code durchführen. Es bietet viel mehr Flexibilität, da Sie die Implementierungen einfach austauschen können, ohne die Klasse selbst neu zu definieren. Besonders praktisch, wenn Sie beispielsweise ClassA und ClassB gegen Scheinobjekte austauschen möchten. Selbst zur Laufzeit wird das Austauschen von Implementierungen (z. B. FTPFileStore vs LocalFileStore) mit der Komposition sauberer. Das bedeutet nicht, dass Vererbung nicht ihren Platz hat, aber die Notwendigkeit einer Mehrfachvererbung würde darauf hindeuten, dass ich mein Design überdenke;)
d11wtq

1
Ich verstehe das nicht Müssen Sie nicht instanziieren ClassAund ClassB? Ist Aufruf methodA:auf MyClassirgendwie automatisch rufen methodA:auf ClassA?
Zakdances

1
Nein, aber Sie können das Verhalten trotzdem durch Weitergabe von Nachrichten teilen, so wie OOP ursprünglich funktionieren sollte. Wenn Sie nicht sofort glauben, dass Sie eine Vererbung benötigen, und stattdessen eine Lösung mit Komposition in Betracht ziehen, werden Sie feststellen, dass Sie Ihre Programme auf eine wartbarere Weise strukturieren. Natürlich hat ObjC eine grundlegende Vererbung für die Fälle, in denen es richtig ist, es zu verwenden.
d11wtq


1
d11wtq, tolle Antwort! Darüber hinaus können Sie mit der Nachrichtenweiterleitung den Schritt der erneuten Implementierung von Methode A und Methode B überspringen. Nachrichten können mit ein wenig Arbeit automatisch an entsprechende Objekte weitergeleitet werden. developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
Arsenius

3

So codiere ich singletonPattern als "übergeordnetes Element". Grundsätzlich habe ich eine Kombination aus Protokoll und Kategorie verwendet.

Das einzige, was ich nicht hinzufügen kann, ist ein neues "ivar", aber ich kann es mit dem zugehörigen Objekt pushen.

#import <Foundation/Foundation.h>
@protocol BGSuperSingleton
+(id) singleton1;
+(instancetype)singleton;
@end

@interface NSObject (singleton) <BGSuperSingleton>

@end

static NSMutableDictionary * allTheSingletons;

+(instancetype)singleton
{
    return [self singleton1];
}
+(id) singleton1
{
    NSString* className = NSStringFromClass([self class]);

    if (!allTheSingletons)
    {
        allTheSingletons = NSMutableDictionary.dictionary;
    }

    id result = allTheSingletons[className];

    //PO(result);
    if (result==nil)
    {
        result = [[[self class] alloc]init];
        allTheSingletons[className]=result;
        [result additionalInitialization];
    }
    return result;
}

-(void) additionalInitialization
{

}

Wann immer ich möchte, dass eine Klasse diesen BGSuperSingleton "erbt", mache ich einfach:

#import "NSObject+singleton.h"

und hinzufügen @interface MyNewClass () <BGSuperSingleton>


2
Kategorien sind keine Mehrfachvererbung. Sie sind eine Möglichkeit, Methoden / Funktionen an eine bereits vorhandene Klasse anzupassen. Durch Mehrfachvererbung kann eine dritte Klasse eine Kombination aus einer oder mehreren Klassen (einschließlich Variablen) sein. Ich mag Kategorien. Kategorien sind sehr nützlich. Sie sind jedoch KEINE Mehrfachvererbung.
Lloyd Sargent

Eine Unterklasse von UIViewController kann jedoch auch Singleton-Muster "unterstützen", falls dies gewünscht wird.
Septiadi Agus

Technisch können alle NSManagedObject "jetzt" [obj singleton] aufrufen. Ich stelle die, die ich wünsche, mit Unterstützung des Protokolls ein. So gut wie Mehrfachvererbung in sowieso. Dies ist nur möglich, wenn die untergeordnete Klasse sowohl die Schnittstelle als auch die Implementierung des übergeordneten Elements unterstützen soll. Wenn nur die Implementierung, dann ist natürlich die Komposition der richtige Weg.
Septiadi Agus

Wenn Sie nur das Protokoll wie <BGSuperSingleton> hinzufügen, können die Klassen die "Singleton" -Methode nicht aufrufen. Sie müssen es noch implementieren ...
CommaToast

-4

Kennen Sie Protokolle, Protokolle ist der Weg, um die Mehrfachvererbung zu implementieren


12
+1 "Um Ähnlichkeiten zwischen Klassen zu erfassen, die nicht hierarchisch miteinander verbunden sind." developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
pokstad

7
In diesem Fall, in dem beide Methoden überschrieben werden, reichen Protokolle aus. In anderen Fällen, in denen Sie die Vererbung zur Wiederverwendung von Code verwenden möchten, helfen Protokolle nicht. Dies kann jedoch normalerweise gelöst werden, indem die Klassen-Superklassen voneinander erben oder indem sie kombiniert werden. In der Regel gibt es eine Möglichkeit, dies richtig zu machen, wenn eine Unterklasse tatsächlich Code mit zwei Klassen teilt.
jake_hetfield

Sie können das Protokoll entweder mit einer Kategorie oder einer Komposition kombinieren.
Septiadi Agus

-1, weil Protokolle überhaupt nicht für die Mehrfachvererbung vorhanden sind. Ähnlich ist es in JAVA, Interfacesnicht oder Mimik Mehrfachvererbung zu liefern.
Thesummersign

1
@FreeAsInBeer Aus Apples eigener Dokumentation Ein Protokoll deklariert eine programmatische Schnittstelle, die von jeder Klasse implementiert werden kann. Protokolle ermöglichen es zwei Klassen, die durch Vererbung entfernt verwandt sind, miteinander zu kommunizieren, um ein bestimmtes Ziel zu erreichen. Sie bieten somit eine Alternative zur Unterklasse . Wie Sie sehen können, verwendet Apple explizit Unterklassen, dh das Erben. Vielleicht wäre es hilfreich, wenn Nikesh dies in seine eigene Antwort aufnehmen würde, um sein Argument zu klären
Honey,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.