Delegates in C#: Wäre sowas machbar?
-
Hallo,
hier ist etwas Code, dass die Delegates in Kotlin ausnützt (siehe http://confluence.jetbrains.com/display/Kotlin/Classes+and+Inheritance --> Delegation):
open trait Base { protected fun base() : Unit { println("base") } } open class BaseImpl : Base { } open trait Base2 { protected fun base() : Unit { println("base2") } } open class BaseImpl2 : Base2 { } open class Foo() { fun foo() { println("foo") } } class Derived(b : Base = BaseImpl(), b2 : Base2 = BaseImpl2()) : Base by b, Base2 by b2, Foo() { fun fooDerived() : Unit { base() } } fun main(args: Array<String>) { d.fooDerived() // prints "base" }
Ich hoffe man kann verstehen was abgeht. Ist nicht so kompliziert. Der wichtige Punkt ist, dass Methode base() in Trait Base protected ist und in Derived trotzdem sichtbar ist. Sonst wäre es banal ;-). Meine Frage ist, ob sowas in C# darstellbar wäre. Habe genug von Java. Diese Sprache ist definitiv nur noch im Status Maintenance. Deswegen mache ich mir Gedanken über C# als Alternative.
Die Motivation von dem Ganzen ist, dass man auf diese Weise das Gleiche hat wie durch Vererbung und damit diese streichen kann (wieder was verschlankt).
Danke, Saxo
-
Soweit ich weiss kann man das in C# nicht erreichen.
-
Ganz ehrlich, ich seh keinen Sinn, Vererbung zu streichen. Ich glaub, du hängst dich da an was auf, was keinen Sinn hat
Dein konkretes Problem ist mir grad zu kompliziert zum Reindenken, bin überarbeitetIch glaub auch, deine Einstellung zu Java ist nicht ganz korrekt. Ich finde Java langweilig, weil die Softwareentwicklung da praktisch industrialisiert wurde. Mit DDD, Spring usw. hat man schon so viele Standardvorgehensweisen, Patterns und Frameworks, dass man Architekturmäßig nicht viel falsch machen kann. Das Grundsystem wird immer mehr oder weniger solide sein. Bei C++ hat man alle Möglichkeiten der Welt, kompletten Unsinn zu machen
Und viele machen das auch. Vor allem gibts da oft sehr viel sehr schlechten Legacy Code, mit dem man leben muss. Da sind Java Programm meiner Erfahrung nach meist viel sauberer.
So, wenn dir die Sprache an sich nicht gefällt (mir auch nicht), schau dir Scala an. Damit kann man auch sehr viele schöne Sachen anstellen und die basiert auch auf der JVM und man kann Java und Scala Programme beliebig mischen. Hab ich schon bei paar Projekten gemacht. Ich finde auch die Sprache und mächtiger als Go (das ist mir zugegebenermaßen nur sehr oberflächlich angeschaut habe). Und durch die Symbiose mit Java gibts schon sehr viele etablierte Frameworks, Libraries, Application Server usw., man muss nicht bei Null anfangen.
-
Ganz ehrlich, ich seh keinen Sinn, Vererbung zu streichen. Ich glaub, du hängst dich da an was auf, was keinen Sinn hat
Dein konkretes Problem ist mir grad zu kompliziert zum Reindenken, bin überarbeitetDie Idee mit den Delegates stammt aus Go. Ist nicht eine Idee von mir, die ich genial finde, weil sie von mir wäre :-). Auf der Kotlin-Homepage steht: "The Delegation pattern has proven to be a good alternative to implementation inheritance, and Kotlin supports it natively requiring zero boilerplate code." (siehe http://confluence.jetbrains.com/display/Kotlin/Classes+and+Inheritance -> Delegates). Das Kotlin-Beispiel ist für mich der Hammer. Das Resultat ist das Gleiche wie Vererbung. Ich entwickle seit 20 Jahren objekt-orientiert mit Smalltalk/Java. Ich denke ich weiß was Vererbung ist und ich sehe faktisch keinen Unterschied zur Vererbung, dabei ist das Ganze mit den Delegates viel simpler und allgemeiner verwendbar. Ich bin noch nicht sicher und noch am Tüfteln/Überlegen, aber ich habe den Verdacht, dass Vererbung ein Fehler war, da viel zu eng gefasst. War halt was neues und deswegen sind alle draufgesprungen.
So, wenn dir die Sprache an sich nicht gefällt (mir auch nicht), schau dir Scala an. Damit kann man auch sehr viele schöne Sachen anstellen und die basiert auch auf der JVM und man kann Java und Scala Programme beliebig mischen. Hab ich schon bei paar Projekten gemacht.
Du hast Scala-Projekte gemacht?? Ich habe das halbe Internet leergesurfed auf der Suche danach. Wenn es tatsächlich Scala-Projekte gibt, gibt mir das ja Hoffnung und ich schaue mir das noch genauer.
Ich finde auch die Sprache und mächtiger als Go (das ist mir zugegebenermaßen nur sehr oberflächlich angeschaut habe).
Ja, ja, Go ist sehr simpel. Es hat aber einge gewisse Ausdrucksstärke, Koherenz und auch Closures. Für System-Programmierung ist es interessant. Für Applikations-Entwicklung wird es wohl kaum verwendet, höchstens server-seitig oder reine Datenverarbeitung.
Danke für die Tipps,
Oliver
-
Ich weiß, dass du das von Go hast, ich kenn ja die anderen Threads von dir. Ich seh nur keinen besonderen Grund, von OOP wegzugehen. Ich bin damit völlig zufrieden. Ich bin kein Anhänger von Scriptsprachen für größere Projekte, und OOP ist mir schon lang ins Blut übergegangen. Ohne mag ich nicht entwickeln, und etwas, was so ähnlich ist, aber doch nicht so ganz, hat mich noch überhaupt nicht überzeugt
Scala ist/war sogar ziemlich beliebt bei den Firmen, die ich kenne. Das wurde nicht unbedingt an die große Glocke gehängt. Offiziell hat man immer noch Java Entwickler gesucht. Aber intern hat man oft in Scala entwickelt, zumindest Teile. War bei vielen Bekannten von mir so. Bei uns war das relativ egal, was man nimmt. Das Hauptprojekt war meist Java, mit Spring, Hibernate und JSF. Aber die einzelnen Komponenten hat man gern in Scala entwickeln dürfen. Bei einigen Projekten war auch das meisten dann in Scala.
-
Ich weiß, dass du das von Go hast, ich kenn ja die anderen Threads von dir. Ich seh nur keinen besonderen Grund, von OOP wegzugehen. Ich bin damit völlig zufrieden.
Vererbung wird nicht gestrichen, es wird nur durch Delegates umgesetzt.
Scala ist/war sogar ziemlich beliebt bei den Firmen, die ich kenne. Das wurde nicht unbedingt an die große Glocke gehängt. Offiziell hat man immer noch Java Entwickler gesucht. Aber intern hat man oft in Scala entwickelt, zumindest Teile.
Ich wünschte das würde bei uns auch gehen.
Das Hauptprojekt war meist Java, mit Spring, Hibernate und JSF. Aber die einzelnen Komponenten hat man gern in Scala entwickeln dürfen.
Das ist wohl ein sinnvoller Mix. Danke für die Info, das gibt mir Auftrieb mal was in Scala zu investieren.
Grüße, Saxo
-
Mir hat gerade eben jemand, der bei einem großen Hersteller an Compilern arbeitet, in einem anderen Forum geschrieben, dass es bei "Multiple Delegation" ähnliche Probleme wie bei Multiple Inheritance gibt. Schei .... Es wäre sooo schön gewesen.
-
Saxo schrieb:
Vererbung wird nicht gestrichen, es wird nur durch Delegates umgesetzt.
Klingt nach einem Fall von: If it ain't broke, dont fix it.
Saxo schrieb:
Mir hat gerade eben jemand, der bei einem großen Hersteller an Compilern arbeitet, in einem anderen Forum geschrieben, dass es bei "Multiple Delegation" ähnliche Probleme wie bei Multiple Inheritance gibt. Schei .... Es wäre sooo schön gewesen.
Naja, wenn es ja nur OOP in Form von Delegates ist, dann muß es auch die gleichen Probleme haben. Probleme wie Mehrfachvererbung sind schließlich konzeptioneller natur und nicht Implementierungsspezifisch.
Saxo schrieb:
Ich denke ich weiß was Vererbung ist und ich sehe faktisch keinen Unterschied zur Vererbung, dabei ist das Ganze mit den Delegates viel simpler und allgemeiner verwendbar.
Klingt ein wenig widersprüchlich. Wenn es keinen Unterschied gibts, warum sollte es dann simpler sein? Simpler wäre ja ein Unterschied. Auch ist "simpler" sehr subjektiv.
Saxo schrieb:
Ich bin noch nicht sicher und noch am Tüfteln/Überlegen, aber ich habe den Verdacht, dass Vererbung ein Fehler war, da viel zu eng gefasst. War halt was neues und deswegen sind alle draufgesprungen.
Also, die Leute die mit OOP angefangen haben waren mit Sicherheit keine "Trittbrettfahrer" die mal eben auf einen Trend aufgesprungen sind weil er gerade cool war.
Saxo schrieb:
Ich entwickle seit 20 Jahren objekt-orientiert mit Smalltalk/Java. Ich denke ich weiß was Vererbung ist[...]
Ohne das abwertend zu meinen... Ich wäre da vorsichtig. Man kann auch 20 Jahre lang etwas falsch machen und gerade beim OOP gibt es haufenweise Leute die zwar felsenfest davon überzeugt sind OOP begriffen zu haben, aber trotzdem ziemlich daneben liegen. Es ist sehr schwer seinen eigenen Kenntnisstand in sowas zu beurteilen, denn sagen wir es so: Woran würdest Du denn erkennen können wenn Dein Verständnis falsch wäre? Um zu erkennen das Du falsch liegst müsstest Du ja gleichzeitig wissen wie es richtig wäre... Was faktisch unmöglich ist...
C# hat eine klare Lösung für Mehrfachvererbung: Es gibt keine. Eine Klasse kann immer nur von genau einer Basisklasse ableiten. Anstelle einer Mehrfachvererbung gibt es jedoch die Möglichkeit eine beliebige Anzahl Interfaces zu implementieren. Auch nach fast 10 Jahren C# habe ich nicht einen Fall (in realen Anwendeungen) gefunden den man damit nicht sauber abbilden konnte.
-
loks schrieb:
...
Auf ganzer Linie