2012-03-26 15 views
2

Ich komme aus einem ECMAScript-Hintergrund (scheint sehr C/C++ zu sein). So habe ich gelernt, klassischen C++ Stil Erbe beteiligt Klassen, Objekte und coole Sachen wie Polymorphismus.Verwendung der Komposition anstelle der Vererbung

Ich mag Android und iOS-Entwicklung in letzter Zeit. Java scheint C-basiert zu sein, also bin ich gut darin, die Mehrheit meiner C-basierten Regeln zu verwenden, aber iOS ist anders genug, dass ich mit meinen Ansätzen misstrauisch bin - besonders mit etwas wie Objektvererbung.

Ich frage, weil es scheint einige starke Meinungen in Bezug auf Zusammensetzung. Von dem, was ich bis jetzt mit Zusammensetzung gesehen habe, bin ich nicht der größte Fan , es sei denn das Projekt bietet einen guten Grund, damit zu arbeiten.

Sie pro Obj-C/iOS Entwickler gibt, würden Sie Komposition über klassische Erbe empfehlen? Oder ist es eine situative Sache?

+1

Dies scheint wie eine potenziell argumentative Meinungsfrage, nicht eine, die zu einer sachlichen Antwort führt. –

+1

Zusammensetzung ist has-a-Beziehung, Vererbung ist is-a-Beziehung. hat-eine Beziehung scheint eine bessere Modularität zu haben als eine Beziehung. – michex

+5

'Bitte' - jedes ** vierte ** Wort * deiner * Post *** muss * * nicht * anders formatiert * sein. 'Backticks ** sind für **' code'. –

Antwort

5

Das Objektmodell von Objective-C ist ganz anders als C/C++/Java. Es ist nachrichtenbasiert und daher wird mehr Gewicht auf Objekte gelegt, die auf Nachrichten reagieren, anstatt Methoden wie in C/C++/Java aufzurufen.

Der Ansatz für die Cocoa-Bibliotheken begünstigt eine flachere Hierarchie Objektvererbung und stützt sich auf die Delegierten Muster für die Anpassung und die Objekthierarchien flach zu halten. Warum das tun? Viele Bibliotheken, insbesondere GUI, leiden an Komplikationen aufgrund von Hierarchie-Blähungen, so dass es nicht klar ist, von welcher Klasse Sie erben würden. Die meisten modernen Objektsysteme in Videospielen zum Beispiel (da sie mein Fachgebiet sind) verwenden Kompositionsparadigmen, bei denen Objekte durch das Mischen von Verhaltensweisen konstruiert werden, da sie flexibler und in der Praxis leichter zu warten sind.

Ich würde nicht sagen Cocoa-Bibliotheken verwenden das Zusammensetzungsmodell als solches, sondern verwenden die Interaktion zwischen Klassen, die in einem der Model-View-Controller-Bereiche eindeutig partitioniert sind und Delegierung für die Anpassung verwendet. Wenn Sie die Anpassung von der Kernfunktionalität getrennt halten, wird die Komplexität gering und die Hierarchien flacher.

0

Wenn eine neue Klasse folgt in der Regel Liskov Substitution Principle in Richtung der Klasse, die sie aus, die Verwendung Vererbung abgeleitet ist, andernfalls bevorzugen Zusammensetzung/Aggregation. Es ist nicht eins gegen das andere, beide sind weit verbreitet.

0

Für mich ist dies eher eine Frage dessen, was Klassen Sie verwenden. Wenn Sie die Core-Foundation- oder UI-Bibliotheken von Apple verwenden, sollten Sie die Unterklassenbildung vermeiden. Viele dieser Klassen sind keine konkreten Klassen, sondern Klassencluster. In diesen Klassen kann das Betriebssystem zur Laufzeit entscheiden, welche Klasse tatsächlich verwendet wird.

Im Allgemeinen ziehe ich Zusammensetzung, wenn ich einen sehr zwingenden Grund zu Unterklasse haben. Selbst wenn ich einen zwingenden Grund zur Unterklasse habe, wähle ich oft stattdessen eine Kategorie von Methoden für die ursprüngliche Klasse.

Verwandte Themen