Hallo, ich arbeite mich weiter in C# ein und komme bei meinem
generischen Wörterbuch. In meiner Übung möchte ich mir eine Erweiterung
für die Klasse Rectangle erstellen, damit ich später hoffentlich
komfortabler die Daten an das Rechteck binden kann, dazu möchte ich das
generische Wörterbuch benutzen.
Die Zeile mit dem erstellen des Eintrag macht mir Proleme. Name und
Farbe funktioniert wunderbar, aber wie komme ich nun an die
Eigenschaften vom Rechteck? Ich möchte die Position X, Y, Höhe, Breite
verändern, aber ein Zugriff klappt nicht.
Wo erstellst du ein Objekt vom Typ Rectangle?
Und wo befüllst du dann dieses Objekt?
Bin ein bisschen raus auf C# und hab keine IDE hier, daher aus dem Bauch
heraus:
Rectangle r = new Rectangle();
r.X.Value = blah;
MyRectangle rect1 = new MyRectangle(1, "Rect 1", r, Color.Green);
Und auf jeden Fall noch mit folgenden Beschäftigen:
Interfaces
Grundregel 1: Programming against an interface not an implementation!!!
Super, Vielen Dank, ohne ein Objekt vom Typ Rectangle wird es schwer was
zu schreiben, jetzt klappt es.
Ok, die Sache mit den Interfaces kommt als nächstes dran.
Hallo, ich hab mir nun viele Beispiele und Tutorials durchgelesen zu
Interfaces. Ich bin mir noch etwas unsicher, ob ich den Wink auf
Interfaces für meine Aufgabenstellung richtig verstanden hab.
Mit dem Interface kann ich mir neue Eigenschaften zur Rechteckklasse
schaffen, wie z.B. eine ID, Farbe und Anzeige, wenn ich nun andere
Geometrien wie Kreis, Elipse Dreieck, dann könnte ich die sehr leicht
über das Interface mit den gleichen Eigenschaften meines Rechteckes
generieren.
Stimmt soweit mein Verständnis?
Ja, im Grunde ist es wie mit dem Leben.
Ein Interface ist ein Vertrag. Die Grundlage eines jeden Handelns.
Mit dem Vertrag beschreibst du nur, was dein Objekt nachher können soll
und nicht wie es das umsetzt.
Wie du schon sagtest, du definierst bspw. Farbe, Umfang, Fläche als
Attribut in einem Interface. Dann muss deine Klasse später diese
Attribute implementieren, wie genau, das ist dann Aufgabe der Klasse.
In einem generischen Dictionary kannst du dann alle Objekte ablegen, die
deinem Vertrag entsprechen. Egal ob Kreis, Rechteck oder was auch immer.
Denn dir ist beispielsweise nur wichtig, die Flächen zu haben.
Wenn man erstmal alles unter Vertrag gestellt hat, ist man bald sehr
flexibler wenn es um Erweiterungen geht.
Daher auch bei einfachen Sachen erstmal angewöhnen einen Vertrag zu
erstellen, dann geht das einem in Fleisch und Blut über und steht nicht
mehr wie ein Ochs vorm Berg, wenn es komplizierter wird.
Gleiches gilt im übrigen auch im .NET Framework, dort gab/gibt es
Interfaces wie bspw. IDictionary. Denn nach welchen Algorithmen nachher
das Dictionary umgesetzt wird, ist erstmal egal.
Man kann dann bspw. bei Anwendungsstart in einer Factory ein Objekt
welches IDictionary implementiert erstellen, je nachdem was man für
einen Anwendungsfall hat. Die eine Umsetzung des Dictionary ist evtl.
beim Füllen schneller, jedoch beim Auslesen langsamer, ein anderes genau
anders herum.
Ich hoffe du erkennst die Vorteile von Schnittstellen (aber auch ein
paar Nachteile wie erstmaliger Mehraufwand und etwas komplexer)
Hallo, danke für deine Antwort.
Ja der Mehraufwand ist erstmal gegeben, aber dafür schaffe ich so die
Möglichkeit der Vielfachvererbung.
Ich fühle mich noch etwas unsicher, aber das Prinzip hab ich wohl
verstanden. Etwas schwierig finde ich noch den Unterschied zwischen
Abstrakte Klasse und Interfaces. In den Beispielen sehen Sie noch sehr
identisch aus, deshalb hapert es noch etwas, trotzdem werde ich meine
jetztige Klasse als Interface auslegen, damit ich mehr Erfahrung sammle
und parallel die Möglichkeit erhalte besser das Interface zuerweiteren
um nicht später nochmal alles neu zumachen.
Meine persönliche Meinung:
Für Anfänger ist die Verwendung von Interfaces sinnlos und nur zu
schreibender Mehraufwand. Der Einsatz von Interfaces ist erst sinnvoll
und zwingend notwendig wenn man konsequent in der Anwendung auf einen DI
Container wie zum Beispiel Autofac oder Ninject setzt. Ohne die
Verwendung des Paradigmas Inversion of Control sollte man sich erstmal
anderen Thematiken der Sprache C# zuwenden...