**Dies ist eine alte Version des Dokuments!**
C# OOP
Quellen
Auftrag in Kürze
Erstelle eine Vector Klasse, mit der du Vektorrechnungen durchführen kannst.
Lerne anhand dieses Beispiels die Grundlagen von OOP in C#.
Auftrag im Detail
- Erstelle ein neues C#-Konsolen-Programm. Nenne es z.B. MathVector
- Erstelle darin eine neue Klasse Vector in einem neuen File (pro Klasse ein .cs File). Klicke dazu im Projektmappen-Explorer mit rechts auf den Namen der Solution → Hinzufügen → Klasse
- Erstelle einen Konstruktor in der Vector-Klasse. Shortcut: ctor + TAB.
- Ein Vector soll dann in Program.cs mithilfe eines Double-Arrays definiert werden können:
Vector v = new Vector(new double[] { 1, 2, 3 });
- Ein Vektor hat Eigenschaften wie seine Dimension (Anzahl Zahlen, aus dem er besteht) oder seine Länge/Magnitude. Ist
v
ein Vektor, so soll z.B. überv.Magnitude
auf diese Eigenschaft zugegriffen werden. Informiere dich darüber, was Eigenschaften und Felder, sowie getter und setter in C# sind. Schaue dir dazu z.B. folgende Quellen an: - Füge nun deiner Vector-Klasse die Eigenschaften „Dim“ (für Dimension), „Magnitude“ und „Components“ hinzu. Diese sollen im Konstruktor über ein privates Feld festgelegt werden und über einen getter abgerufen werden. Natürlich sollen sie nicht von aussen über einen setter verändert werden können! Die Eigenschaft „Components“ beinhaltet das Double-Array zurückgeben, welches den Vektor definiert.
- Füge deiner Klasse folgende (nicht-statische) public Methoden hinzu:
IsNull()
undIsUnit()
. Diese geben den Bool true oder false zurück, jenachdem ob es sich beim Vektor um einen Nullvektor oder einen Einheitsvektor (unit vector) handelt.
- Nun wollen wir mit den Vektoren Rechnen können. Dazu fügen wir drei statische Methoden mit den Namen Add, Sub und ScalarProd für die Vektoraddition, Vektorsubtraktion und das Skalarprodukt hinzu. Über
Vector.Add(v1,v2);
soll man dann die Vektorsumme zweier Vektoren berechnen können.
- Die beiden Rechenmethoden vom letzten Punkt sollen können nur Funktionieren, wenn beide Vektoren, die als Argument übergeben werden, die gleiche Dimension haben. Überprüfe dies und gib gegebenenfalls einen Fehler aus:
throw new System.Exception("...");
- Nun wollen wir aber nicht immer
Vector.Sub(v1,v2);
schreiben müssen, um zwei Vektoren zu Subtrahieren. Stattdessen soll das mit dem Operator-
, alsov1-v2
, gehen. Dies geht ganz einfach mit einem Operator Overloading, siehe z.B. hier: C# - Operator Overloading. Füge nun jeweils ein Operator Overloading für die Operatoren + (Vektoraddition), - (Vektorsubtraktion) und * (Skalarprodukt) hinzu.
- Über eine Eigenschaft soll von einem Vektor der zugehörige Einheitsvektor ausgegeben werden:
v.UnitVector
. Dieser Einheitsvektor soll selbst wieder vom Typ Vector sein! Um von einem Vektor den zugehörigen Einheitsvektor zu erhalten, dividiert man jede Komponente des Vektors durch die Länge des gesamten Vektors. Tipp: Überlege dir gut, wo genau der Einheitsvektor berechnet werden soll!
Neue Features:
- Ein bestehender Vektor soll überschrieben werden können, aber nur, wenn er die gleiche Dimension wie der bestehende hat. Dazu soll man einfach
v.Components
neu setzen können. Dies geschieht im setter der Components-Eigenschaft.
Zusatzaufgaben
- Füge nun auch die Skalarmultiplikation hinzu. Dort wird ein Vektor mit einer reellen Zahl gestreckt oder gestaucht. Der Operator
*
soll so überladen werden, dassv1*v2
das Skalarprodukt ergibt und (s sei eine Zahl, kein Vektor)v*s
oders*v
die Skalarmultiplikation.
- Erweitere deine Klasse mit weiteren sinnvollen Methoden usw.
- Falls du sehr motiviert bist, könntest du eine Klasse Matrix definieren, mit der man Matrizen-Rechnungen durchführen kann.
2D-Drawing
Ziel dieses Projekts: eine 2D-Zeichen-Bibliothek mit OO in C# schreiben, die es erlaubt, eine Zeichnung aus verschiedenen Objekten zu kombinieren und als Bild oder am Bildschirm auszugeben.
Dazu benötigen wir:
- eine solide 2D-Vektor Klasse (s.o.)
- eine Hierarchie von 2D-Figuren (Figure, Polygon, Circle, Oval…)
- 2D-Figuren sollen Eigenschaften haben wie:
- Stroke (Rand: Farbe, Breite, Strichart: dashed / solid)
- Fill (Füllung: Farbe inkl. Transparenz)
- eine Canvas (Leinwand), auf der die Figuren gezeichnet werden.
Dieses Repo hilft dir beim Start.
Hausaufgaben
- 2023-05-24
- Diese Figur zeichnen können:
Ideen für Erweiterungen
- Mehr Figuren (
Circle
… noch mehr) - Eine
public void move(Vector v)
Methode aufFigure
, die es erlaubt, jede Figur zu bewegen (Wie? Zum Beispiel, indem alle Punkte der Figur bewegt werden - vielleicht benötigt jaVector
einemove
Methode?) - 2D-Figuren kombinieren (add/subtract von Flächen): kannst du dieses Gemälde malen?