Sollte C# haben Mehrfachvererbung?
Ich habe stoßen zahlreiche Argumente gegen die Einbeziehung der Mehrfachvererbung in C#, von denen einige (philosophische Argumente beiseite):
- Mehrfachvererbung ist zu kompliziert und oft nicht eindeutig
- Es ist unnötig, weil-Schnittstellen sorgen für etwas ähnliches
- Zusammensetzung ist ein guter Ersatz, wo die Schnittstellen sind unangebracht
Komme ich aus einer C++ - hintergrund verpassen und die Kraft und Eleganz der Mehrfachvererbung. Es ist zwar nicht geeignet, um alle software-designs gibt es Situationen, wo es schwierig ist, es zu leugnen-Programm über Schnittstellen, Zusammensetzung und ähnlichen OO-Techniken.
Ist der Ausschluss der Mehrfachvererbung zu sagen, dass die Entwickler nicht schlau genug, um zu verwenden Sie Sie mit bedacht und unfähig sind, die Bewältigung der Komplexität, wenn Sie auftreten?
Ich persönlich würde es begrüßen die Einführung der Mehrfachvererbung in C# (vielleicht C##).
Nachtrag: ich wäre daran interessiert zu wissen, aus den Antworten, die aus einer einzigen (oder prozessuale hintergrund) im Vergleich zu einer Mehrfachvererbung hintergrund. Ich habe oft gefunden, dass Entwickler, die noch keine Erfahrung mit Mehrfachvererbung wird Häufig standardmäßig die mehrfach-Vererbung-ist-unnötig-argument, nur weil Sie noch keine Erfahrung mit dem Paradigma.
- C## - ich mag das 😉
- Ich kann nicht erkennen, was Mehrfachvererbung ist elegant.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich nie verpasst es einmal, nicht immer. Ja, es [MI] kompliziert wird, und ja, Schnittstellen tun, die eine ähnliche Arbeit in vielerlei Hinsicht - aber das ist nicht der größte Punkt: im Allgemeinen Sinn, es ist einfach nicht notwendig die meiste Zeit. Auch mit einfacher Vererbung ist überstrapaziert in vielen Fällen.
Lieber aggregation über Vererbung!
ist oft besser behandelt werden mit
Diese Weise können Sie den swap in und aus verschiedenen Implementierungen des IBarrable und IBazzable zu erstellen Sie mehrere Versionen der App, ohne zu schreiben, noch eine andere Klasse.
Dependency injection kann mit Hilfe dieser eine Menge.
aggregation
undcomposition
: en.wikipedia.org/wiki/Object_composition#AggregationEines der Probleme bei Umgang mit Mehrfachvererbung ist die Unterscheidung zwischen schnittstellenvererbung und implementierungsvererbung.
C# bereits eine saubere Implementierung von interface-Vererbung (einschließlich der Wahl von impliziten oder expliziten Implementierungen) durch die Verwendung von reinen Schnittstellen.
Wenn man sich an C++, für jede Klasse geben Sie nach dem Doppelpunkt in der
class
Erklärung, die Art der Vererbung, die Sie bekommen, ist bestimmt durch die zugriffsmodifizierer (private
,protected
oderpublic
). Mitpublic
Vererbung, erhalten Sie die volle Wirrwarr von mehrfach-Vererbung—multiple Schnittstellen gemischt sind mit mehreren Implementierungen. Mitprivate
Vererbung, bekommst du nur die Umsetzung. Ein Objekt von "class Foo : private Bar
" kann nie an eine Funktion übergeben, die erwartet, dass einBar
weil es ist, als wenn dieFoo
Klasse wirklich nur eine privateBar
Feld und eine automatisch implementierte delegation Muster.Reine multiple implementierungsvererbung (das ist wirklich nur eine automatische Delegierung), nicht alle Probleme und wäre genial zu haben in C#.
Als für mehrere interface-Vererbung von Klassen, es gibt viele verschiedene mögliche designs für die Implementierung der Funktion. Jede Sprache verfügt über mehrere Erbe hat seine eigenen Regeln, was passiert, wenn eine Methode aufgerufen wird, mit dem gleichen Namen in mehreren Basisklassen. Einige Sprachen wie Common Lisp (vor allem die CLOS-object system), und Python, ein meta-Objekt-Protokoll, wo Sie festlegen können, dass die Basis-Klasse vor.
Hier ist eine Möglichkeit:
In diesem Fall wird nur der erste aufgeführt ist Klasse, die Umsetzung ist implizit geerbt, im Falle eines Konflikts. Die Klasse für andere sockel Typen müssen explizit angegeben werden, um auf Ihrer Implementierungen. Um es idiotensicher, kann der compiler nicht zulassen implizite Vererbung im Falle eines Konflikts (Konflikt stehenden Methoden benötigen immer einen cast).
Können, können Sie auch umsetzen Mehrfachvererbung in C# heute mit der impliziten Konvertierung Operatoren:
Es ist nicht perfekt, aber es ist nicht unterstützt durch die
is
undas
Operatoren undSystem.Type.IsSubClassOf()
.Hier ist eine sehr nützliche Fall für die mehrfache Vererbung, dass ich in all der Zeit.
Als ein toolkit Hersteller, die ich nicht ändern kann veröffentlichte API ' s oder ich werde brechen die Abwärtskompatibilität. Eine Sache, die Ergebnisse aus, dass ist, dass ich nicht immer hinzufügen, um eine Schnittstelle einmal habe ich freigegeben, weil es brechen würde compilation für jemand, es umzusetzen -- die einzige option ist die Erweiterung der Schnittstelle.
Dies ist in Ordnung für bestehende Kunden, sondern neue sehen würde, diese Hierarchie als unnötig Komplex, und wenn ich es entwerfen, von Anfang an, ich würde nicht ablehnen, um es zu implementieren auf diese Weise -- ich, oder ich will verlieren rückwärts-Kompatibilität. Wenn die Schnittstelle ist intern, ich habe dann einfach fügen Sie es und fixieren Sie die implementors.
In vielen Fällen die neue Methode, die Oberfläche hat eine offensichtliche und kleine Standard-Implementierung, aber ich kann mich nicht zur Verfügung stellen.
Ich würde es vorziehen, zu verwenden, abstrakte Klassen und dann, wenn ich eine Methode hinzufügen, fügen Sie einen virtuellen, mit einer default-Implementierung, und manchmal tun wir dies.
Das Problem ist natürlich, wenn diese Klasse würde wahrscheinlich vermischt werden, etwas, das ist schon etwas erweitern-dann haben wir keine Wahl, sondern eine Schnittstelle und befassen sich mit der Erweiterung Schnittstellen.
Wenn wir denken, wir haben dieses problem in einem großen Weg, entscheiden wir uns für ein reichhaltiges event-Modell statt-ich denke, das ist wahrscheinlich die richtige Antwort in C#, aber nicht jedes problem auf diese Weise gelöst-manchmal möchten Sie eine einfache öffentliche Schnittstelle, und ein reicher, für die Extender.
C# unterstützt einfache Vererbung, Schnittstellen-und extension-Methoden. Zwischen Ihnen, Sie bieten gerade über alles, dass Mehrfachvererbung bietet, ohne die Kopfschmerzen, die Mehrfachvererbung bringt.
Mehrfachvererbung nicht unterstützt wird von der CLR in keiner Weise bewusst bin, so bezweifle ich, es könnte unterstützt werden, in einer effizienten Art und Weise, wie es in C++ oder Eiffel, die können es besser machen, gegeben, dass die Sprache ist speziell für die MI).
Eine schöne alternative zur Mehrfachvererbung ist die Traits genannt. Es ermöglicht Ihnen, mischen Sie die verschiedenen Einheiten des Verhaltens in einer einzigen Klasse. Ein compiler unterstützen können Merkmale wie eine compile-time-Erweiterung der einfachen Vererbung Typ-system. Sie einfach erklären, dass Klasse X enthält Merkmale A, B und C, und der compiler legt die Merkmale, Fragen Sie nach, bilden gemeinsam die Umsetzung von X.
Angenommen, Sie versuchen, zu implementieren, die IList(of T). Wenn Sie einen Blick auf die verschiedenen Implementierungen der IList(of T), Sie teilen oft einige der exakt gleiche code. Das waren Eigenschaften kommen. Sie einfach erklären, ein Merkmal, mit dem gemeinsamen code, und Sie können verwenden, dass der gemeinsame code in die Implementierung der IList(of T) - auch wenn die Umsetzung hat bereits einige weitere Basis-Klasse. Hier ist, was die syntax könnte so Aussehen:
Sind und Sie die Eigenschaft wie diese:
Natürlich bin ich nur an der Oberfläche gekratzt hier. Für eine vollständige Beschreibung finden Sie unter das Papier Merkmale: Composable Units of Behavior (PDF).
Den Rost Sprache (von Mozilla) umgesetzt hat, die Merkmale in einer interessanten Art und Weise: Sie bemerkt, dass die Merkmale sind ähnlich wie Standard-interface-Implementierungen, so dass Sie einheitliche Schnittstellen und Eigenschaften in einer einzigen Funktion, die Sie aufrufen, Eigenschaften). Der wesentliche Unterschied zwischen Eigenschaften und die Standard-interface-Implementierungen (Java jetzt hat) ist, dass Merkmale enthalten kann, die private oder protected-Methoden, im Gegensatz zu herkömmlichen interface-Methoden müssen öffentlich sein. Wenn die Eigenschaften und Schnittstellen sind nicht einheitlich in einer einzigen Funktion, dann ein weiterer Unterschied ist, dass Sie einen Verweis auf eine Schnittstelle, aber Sie können nicht einen Verweis auf eine Eigenschaft; eine Eigenschaft ist, die nicht selbst eine Art.
Vermisse ich die mehrfache Vererbung für einen bestimmten Grund... das dispose-Muster.
JEDES mal muss ich implementieren Sie das dispose-Muster, sage ich mir: "ich wünschte, ich könnte nur ableiten von einer Klasse implementiert, dass das dispose-Muster mit ein paar virtuelle überschreibt." Ich kopieren und einfügen die gleichen boiler-plate-code in jeder Klasse, die IDispose und ich hasse es.
Ich würde behaupten, gegen Mehrfachvererbung einfach aus dem Grund Stand. Entwickler missbrauchen. Ich habe genug gesehen, um Probleme mit jeder Klasse erbt, die von einer utility-Klasse, nur so können Sie eine Funktion aufrufen, die aus jeder Klasse, ohne zu geben, so viel, zu wissen, dass Mehrfachvererbung würde führen zu schlechten code in vielen Situationen. Das gleiche kann gesagt werden über "GoTo", das ist einer der Gründe, es ist so verpönt. Ich denke, dass Mehrfachvererbung einige gute verwendet, genauso wie Springen, In einer idealen Welt, wo Sie beide wurden nur verwendet, wenn angemessen, gäbe es keine Probleme. Doch die Welt ist nicht ideal, und deshalb müssen wir uns schützen, schlechte Programmierer vor sich selbst.
JA! JA! und JA!
Ernst, ich habe die Entwicklung von GUI-Bibliotheken, die meine ganze Karriere, und MI (Multiple Vererbung) macht dies so viel einfacher, als SI (Single Inheritance)
Ersten habe ich SmartWin++ in C++ (MI stark gebraucht), dann habe ich Gaia Ajax und jetzt endlich Ra-Ajax und ich kann mit extrem zuversichtlich, Staat, MI-Regeln für einige Orte. Einer jener Orte, die als GUI-Bibliotheken...
Und die Argumente, die behaupten, die MI "zu Komplex" und solche sind meist wieder Menschen, die versuchen zu konstruieren, die Sprache zu kriegen und geschieht, zu gehören zu dem Lager, das "derzeit nicht MI"...
Ebenso wie funktionale Programmiersprachen (wie Lisp) gelehrt worden (durch die "nicht-Lispers") als "zu Komplex" durch nicht-funktionale Programmiersprache-Befürworter...
Menschen Angst vor dem unbekannten...
MI-REGELN!
Ich bin froh, dass C# keine Mehrfachvererbung, auch wenn es manchmal bequem sein. Was ich möchte, um zu sehen, stattdessen ist die Fähigkeit, eine Standard-Implementierung einer interface-Methode. Das heißt:
In diesem Fall
((I)new C()).F()
rufenC
's Umsetzung vonI.F()
, während((I)new C()).G()
rufenDefaultI
's Umsetzung vonI.G()
.Gibt es eine Reihe von Problemen auf, die die Sprache der Designer arbeiten, bevor diese Hinzugefügt werden könnten, um die Sprache, aber keine, die sind sehr schwer und das Ergebnis würde für viele der Bedürfnisse, die Mehrfache Vererbung wünschenswert.
Ich arbeite mit C#, da es als erstes zur Verfügung, der als alpha - /beta-release und habe es nie vermisst Mehrfachvererbung. MI ist ganz nett für einige Dinge, aber es gibt fast immer andere Möglichkeiten, um das gleiche Ergebnis zu erzielen (von denen einige tatsächlich am Ende als einfacher oder erstellen eines leichter zu verstehen, Umsetzung).
Mehrfache Vererbung im Allgemeinen kann nützlich sein, und viele OO-Sprachen implementiert es die eine oder andere Weise (C++, Eiffel, CLOS, Python...). Ist es so wichtig? Nein. Ist es schön zu haben? Ja.
Update
Ich fordere jeden, Stimmen mich nach unten um mir zu zeigen, ein beliebiges Beispiel für Mehrfachvererbung, die ich nicht so leicht Anschluss zu einer Sprache mit einfachvererbung. Es sei denn jemand kann zeigen solche Probe, ich behaupte, es existiert nicht. Ich habe portiert, Tonnen von C++ - code (MH) in Java (kein MH) und das war nie ein problem, egal wie viel MH der C++ - code verwendet.
Niemand konnte jemals beweisen, so weit, dass mehrfache Vererbung hat von Vorteil über andere Techniken, die Sie erwähnt in Ihrem Beitrag (mit Schnittstellen und Delegaten, die ich bekommen kann genau das gleiche Ergebnis ohne viel code oder overhead), während es hat ein paar bekannte Nachteile (diamond-problem die meisten ärgerlich sind).
Tatsächlich mehrfache Vererbung ist in der Regel missbraucht. Wenn du OO-design irgendwie Modell der realen Welt in Klassen, die Sie nie an den Punkt, wo Mehrfachvererbung macht tatsächlich Sinn. Können Sie ein nützliches Beispiel für mehrfache Vererbung? Die meisten der Beispiele, die ich bisher gesehen habe, sind eigentlich "falsch". Sie machen etwas, was eine Unterklasse, das ist tatsächlich nur eine zusätzliche Eigenschaft und damit eigentlich eine Schnittstelle.
Werfen Sie einen Blick auf Sather. Es ist eine Programmiersprache, wo Schnittstellen zu tun haben, Mehrfachvererbung, wie die, warum nicht (es kann nicht erstellen Sie eine Diamant-problem), aber die Klassen, die keine Schnittstellen haben keine erbschaft zu löschen. Sie kann nur interfaces implementieren, und Sie können die "zählen" andere Objekte, die diese anderen Objekte, die einen festen Teil von Ihnen, aber das ist nicht das gleiche wie Vererbung, es ist eher eine form der delegation (Methodenaufrufe "geerbt" durch die Einbeziehung von Objekten sind in der Tat nur weitergeleitet, um Instanzen dieser Objekte gekapselt in Ihrem Objekt). Ich denke, das Konzept ist ziemlich interessant und es zeigt, können Sie eine komplette sauber OO-Sprache, ohne die Implementierung der Vererbung überhaupt.
Keine.
(für die Abstimmung)
einer der wirklich schönen und (zur Zeit) neuartige Dinge über die DataFlex 4GL-v3+ (ich weiß, ich weiß, Daten was?) war seine Unterstützung für mixin Vererbung - die Methoden von anderen Klassen wiederverwendet werden konnte in Ihrer Klasse, so lange, wie Sie Ihre Klasse, sofern die Eigenschaften, die diese Methoden benutzt, es hat Prima funktioniert, und es war kein "diamond-problem" oder anderen mehrfach-Vererbung "Fallstricke" zu befürchten.
ich möchte sehen, wie so etwas in C#, da es vereinfachen würde, bestimmte Arten von Abstraktion und Konstruktion, Probleme
Statt der Mehrfachvererbung, die Sie verwenden können,Mixins in Verbindung, das ist eine bessere Lösung.
Ich denke, es würde über die Dinge zu komplizieren, ohne genügend ROI. Wir sehen schon die Leute die Metzgerei .NET-code mit zu-Tiefe Vererbung Bäume. Ich kann mir nur vorstellen, dass die Gräueltaten, wenn die Menschen die macht hatten zu tun, die mehrfache Vererbung.
Ich will nicht leugnen, dass es potential hat, aber ich sehe nicht genug nutzen.
Während es gibt sicherlich Fälle, in denen es nützlich sein kann, habe ich festgestellt, dass die meisten der Zeit, wenn ich glaube, ich brauche es, ich weiß es wirklich nicht.
Einen Kollegen schrieb in diesem blog über wie man so etwas wie Mehrfachvererbung in C# mit Dynamischen Zusammenstellung:
http://www.atalasoft.com/cs/blogs/stevehawley/archive/2008/09/29/late-binding-in-c-using-dynamic-compilation.aspx
Ich denke seine wirklich einfach. Genau wie jede andere komplexe Programmier-Paradigma, können Sie missbraucht und dich verletzt. Können Sie Missbrauch Objekte (oh ja!), aber das bedeutet nicht, dass OO ist schlecht in sich selbst.
Ähnlich verhält es sich mit MI. Wenn Sie nicht über einen großen "Baum" von vererbten Klassen, oder eine Menge von Klassen, die gleich benannte Methoden sind, dann werden Sie völlig in Ordnung, mit MI. In der Tat, wie MI bietet die Umsetzung, Sie werden oft besser aus als eine SI-Umsetzung, wo haben Sie zu re-code, oder cut&paste-Methoden an Objekte delegiert. Weniger code ist besser in diesen Fällen.. Sie können eine allmächtige Chaos-sharing-code, indem Sie versuchen, die Wiederverwendung von Objekten durch interface-Vererbung. Und solche workarounds nicht riechen Recht.
Ich denke, dass die single-Vererbung-Modell .NET ist falsch: Sie hätten mit Schnittstellen, oder MI nur. Mit "halb und halb" (dh einzelne Implementierung Vererbung plus multiple interface inheritance) ist mehr verwirrend als es sein sollte, und auch nicht elegant auf allen.
Ich komme aus einer MI-hintergrund, und ich bin nicht erschrocken, oder verbrannt durch es.
Habe ich geschrieben das hier ein paar mal, aber ich denke, es ist wirklich cool. Sie können lernen, wie man gefälschte MI hier. Ich denke auch, dass der Artikel zeigt, warum die MI ist wie ein Schmerz, auch wenn das nicht beabsichtigt war.
Ich weder miss es oder braucht es, ich bevorzuge die Zusammensetzung von Objekten zu erreichen, meine endet. Das ist wirklich der Punkt, der den Artikel als gut.
Ich habe multiple inheritence in C++ auch selbst an, aber Sie haben wirklich zu wissen, was Sie tun, um nicht selbst in Schwierigkeiten, vor allem, wenn Sie zwei Basis-Klassen, die eine gemeinsame Großeltern. Dann können Sie in Probleme mit virtuellen inheritence, zu erklären, jeder Konstruktor du gehst zu nennen, die die Kette (was macht binäre Wiederverwendung viel schwerer)... es kann ein Durcheinander.
Mehr wichtiger ist, die Art und Weise der CLI ist derzeit errichtet verhindert, MI von umgesetzt leicht. Ich bin mir sicher, dass Sie es tun könnte, wenn Sie wollte, aber ich habe andere Dinge, die ich lieber sehen in der CLI als multiple inheritence.
Dinge, die ich möchte, um zu sehen, gehören einige der Funktionen der Spec#, wie null-Referenz-Typen. Ich würde auch gerne mehr sehen, Objekt-Sicherheit, indem Sie in der Lage, Parameter zu deklarieren, die als const, und die Möglichkeit zum deklarieren einer Funktion const (was bedeutet, dass Sie garantieren, dass der interne Zustand eines Objekts nicht geändert werden, von der Methode und der compiler überprüft werden).
Ich denke, dass zwischen Single-Inheritence, Mehrere Interface-Inheritence, Generika und Erweiterung-Methoden, die Sie tun können, so ziemlich alles was Sie brauchen. Wenn Sie etwas verbessern könnten, Dinge, die für jemanden in dem Wunsch, MI, ich denke, irgendeine Art von Sprache konstruieren, die würde erlauben würde, einfacher aggregation und Komposition erforderlich ist. So können Sie eine gemeinsame Schnittstelle, aber dann delegieren Sie die Umsetzung an eine private Instanz der Klasse, die Sie normalerweise Erben aus. Jetzt, dass nimmt eine Menge von boiler plate code zu tun. Mit einem automatisierten Sprach-feature für, das würde deutlich helfen.
Ich bevorzuge C++. Ich habe von Java, C#, etc. Wie meine Programme erhalten mehr anspruchsvolle, in so einer OO-Umgebung, finde ich mich fehlt Mehrfachvererbung. Das ist meine subjektive Erfahrung.
Kann es für erstaunlich, spaghetti-code...kann es für erstaunlich elegant code.
Ich glaube, dass Sprachen wie C# sollte der Programmierer die Möglichkeit. Nur weil es vielleicht zu kompliziert bedeutet nicht, dass es werden zu kompliziert. Programmiersprachen sollten die Entwickler mit tools zu bauen, die alles, was der Programmierer will.
Wählen Sie zur Nutzung dieser API die Entwickler bereits schrieb, sind Sie nicht zu haben.
Geben C# implicits und werden Sie nicht verpassen die mehrfache Vererbung oder Erbe für diese Angelegenheit.
Nein, ich nicht. Ich benutze alle anderen OO-features zu entwickeln, was ich will. Ich benutze Schnittstelle und Kapselung Objekt und ich bin nie auf das, was ich tun will.
Ich versuche nicht, die Vererbung verwenden. Umso weniger kann ich garantieren.
Nicht, es sei denn, Diamant-problem ist gelöst. und können Sie nutzen Zusammensetzung bis heute nicht gelöst ist.
Nein, wir kamen Weg von ihm. Sie brauchen es jetzt.
Wenn wir uns vorstellen, Mehrfachvererbung, dann sind wir wieder vor der alten Diamant-problem von C++...
Jedoch für diejenigen, die denken, es ist unvermeidlich, wir können uns immer noch vorstellen Mehrfachvererbung Effekte durch Komposition (Komponieren, mehrere Objekte in ein Objekt und setzen die öffentlichen Methoden, die Verantwortlichkeiten zu komponiert Objekt und zurück)...
Warum also die Mühe machen, mehrere die erbschaft-und machen den code anfällig für unvermeidbare Ausnahmen...
Ich Nein sagen, bis das Diamant-Problem (ein großer Grund, warum multiple inheritence mit Klassen ist schlecht) gelöst ist angemessen und wenn die Lösung ist so gut, wie mit interfaces. Kurz gesagt, das Diamant-Problem im Grunde genommen zu tun hat mit Mehrdeutigkeiten in den Daten, Methode und Ereignisse in Klassen durch multiple inheritence über Klassen.
P/S Sie "selten" zu vermeiden, eine Programmier-Lösung, die Sie dringend brauchen, nur weil es schwer ist. "Schwierigkeit" ist keine Entschuldigung dafür, nicht multiple inheritence. Multithreading ist hart, aber es ist in C# verfügbar. Eine große für nicht mit multiple inheritence ist aufgrund diamond-problem (http://en.wikipedia.org/wiki/Diamond_problem). Ein smiliar Argumentation anwenden, um Ihren Kommentar über bessere alternativen (Menschen lösen und denken in verschiedenen Möglichkeiten, so dass man manchmal die Lösung ist eine schlechte Idee) und geeignete Optionen bereits existieren (warum erstellen LINQ wenn ADO.NET der trick funktioniert und ausgereift ist...aufgrund der Stärke des einen über den anderen.)
Ich fast don ' T miss Mehrfachvererbung in C#.
Wenn Sie mehrere inhertance zu definieren, die eine tatsächliche domain-Modell, das dann in meiner Erfahrung, kann man oft ein gleich gutes design mit einfacher Vererbung und einige gute design-patterns.
Meisten der Orte, wo ich zu finden Mehrfachvererbung werden von wirklichem Wert sind die Orte, wo es nicht die domain selbst, aber einige Technologie/framework Einschränkung, die erfordert die Verwendung von MI. Implementierung von COM-Objekten mit ATL ist ein sehr gutes Beispiel für die Verwendung von Mehrfachvererbung zu implementieren alle notwendigen Schnittstellen, die Sie COM-Objekt braucht, und eine elegante Lösung zu einem hässlich (im Vergleich zu .NET) - Technologie. Elegant aus der Sicht, dass es ein C++ - framework!
Habe ich die situation jetzt aber, wo ich verwenden könnte, die mehrfache Vererbung. Ich habe eine Klasse, die Bedürfnisse ableiten von Funktionen aus einer anderen Domäne-Objekt, aber es muss auch zugänglich sein für cross-AppDomain-Anrufe. Dies bedeutet, dass es MUSS von MarshalByRefObject Erben. Also in diesem speziellen Fall, ich möchte wirklich, dass die Ableitung sowohl von MarshalByRefObject abgeleitet und meinem spezifischen Domäne-Objekt. Das ist jedoch nicht möglich, also meine Klasse zu implementieren hat die gleiche Schnittstelle wie meine domain-Objekt, und umleiten der Anrufe auf eine aggregierte Instanz.
Aber das ist, wie gesagt, einen Fall, wo die Technologie/framework stellen eine Einschränkung, und nicht dem domain-Modell.
Es würde die Dinge einfacher, weniger code, wenn Schnittstellen könnte die Umsetzung. Aber könnten Sie miss-mehr als richtig eingesetzt? Ich denke, dass, bis Sie sehen, wie es getan werden kann, richtig ist, werden Sie nicht verpassen es. Sie ärgern mich mit den Argumenten, dass mehrfach-Vererbung ist unsicher. Es ist nicht. Aber fast alle Implementierungen von Programmiersprachen sind. Aber BRAUCHEN wir das?, Ich weiß es nicht.
Ich würde lieber zurück geben Kovarianz, diese können leicht Hinzugefügt werden (einfach nur entspannen, die Regeln, auf den Rückgabetyp auf über-geritten-Methoden), und ist immer sicher.
Beispiel:
IFoo
) zum angeben einer statischen Klasse (z.B.IFooHelpers
), dass, wenn beim kompilieren der KlasseC
der diese Schnittstelle implementiert, kann der compiler nicht finden, eine Implementierung für ein Mitglied (z.B.int DoSomething(string Bar)
es sollte automatisch code generierenint IFoo.DoSomething(string Bar) {return IFooHelpers.Classes<C>.DoSomething(C This, string Bar);}
werden, vorausgesetzt, die entsprechenden statischen Klasse und Methode vorhanden sind.Interfaces sind Mehrfachvererbung. Als eine Angelegenheit von der Tat, würde ich prüfen, Java/C# - Typ-Schnittstellen die "richtige" Implementierung der Mehrfachvererbung. Zwingen Mehrfachvererbung durch den Einsatz von interfaces, dann eher so dass die Vererbung von mehrere konkrete oder abstrakte Klassen zwingt die Entwickler Zusammensetzung/delegation für die Wiederverwendung von code. Vererbung sollte niemals verwendet werden, für die Wiederverwendung von code, und der Abwesenheit von C++ - Typ Mehrfachvererbung Entwickler zu kommen mit besser entwickelten Klassen.