C# Softwareentwicklung Strategie Muster?

 - (Computer, Programmieren, Informatik)  - (Computer, Programmieren, Informatik)  - (Computer, Programmieren, Informatik)  - (Computer, Programmieren, Informatik)

4 Antworten

Tausch "implements" und "extends" durch einen Doppelpunkt und "System.out.println" durch "Console.WriteLine" aus.
Die beiden Variablen in der "Einheit"-Klasse haben keinen Zugriffsmodifizierer und sind dadurch per Default private, mach die protected.
Dann sollte es laufen.

Abgesehen davon, dass das minimalste Grundlagen sind, die man sich mit ein paar Minuten Google aneignen kann:

Solche Patterns sind eigentlich so gedacht, dass sie unabhängig von der Sprache anwenden kann, vorausgesetzt, man hat sie verstanden.
Die Umsetzung ist meist kein Problem, wichtig ist, was es für ein Problem lösen soll und was die Idee dahinter ist. Wenn man das wirklich verstanden hat, kannst Du dir den Code selber herleiten. Nur so machen Patterns sind, denn die Anwendung ist immer ein bisschen anders, als in den Erklärungen dazu, deshalb heißen sie ja auch "Muster".

Halte dich also nicht zu sehr an der Implementierung auf, die ist nebensächlich. Wenn Du das Gefühl hast, die Gedankengänge dahinter noch nicht verstanden zu haben, dann sollte deine Frage lieber dort anknüpfen ;)

Woher ich das weiß:Beruf – C# Softwareentwickler seit 2013

PS:

Stimmt, ganz vergessen:
Die Methoden in der abstrakten Klassen müssen "virtual" sein und die Ableitungen der abstrakten Klassen müssen diese Methoden mit "override" deklariert haben.

1

Ich kenne die Darstellung für die Aufgabenstellung nicht, aber meine Interpretation ist, dass es drei Klassen gibt, die dasselbe Interface implementieren. Desweiteren gibt es eine Referenz vom Typ des Interfaces, über die die anwenden-Methode aus einem (Test-)Kontext heraus aufgerufen wird. Abstrakte Klassen sehe ich keine - das kann aber auch an mir liegen....

Woher ich das weiß:Studium / Ausbildung – Datenverarbeitungs-Kfm, Hobby- und Profi-Programmierer

Die Klasse Einheit ist doch abstract ?!

Wenn ich das in C# nachbaue, würde ich folgende Klasse bauen:

public abstract class Einheit

in dieser Klasse würde ich die Schnittstellen Implementieren (So wie auf dem Bild)
Dazu 2 Methoden, die Signatur würde aber so aussehen:

public virtual void bewegen() { bewegungsVerhalten.bewegen(); }

Die Schnittstelle bleibt gleich mit einer Methode void bewegen()

Eine Klasse, zum beispiel PferdeRitter, würde dann so aussehen:

public class PferdeRitter : Einheit

Somit kann ich in der Klasse PferdeRitter auf die Methode bewegen zugreifen und eine spezielle bewegung für diese Klasse machen.

Oder bin ich hier auf dem holz weg :D

0
@Tastaturbrix

Was heißt denn "würde ich machen"? Probier's doch einfach aus und schau dir an, was der Compiler sagt. Das, was dir da erklärt wird, ist übrigens das Strategy-Pattern. Wenn du das im Kurs nicht verstanden hast, dann solltest du den Begriff mal googeln. ;)

0
@Tastaturbrix

Ach das ist der Java-Code?! Öhm... ach so. Ich dachte, das sei dein C# Code. Sieht ja auf den ersten Blick ziemlich ähnlich aus. Dann hab ich das falsch verstanden.

1
@Tastaturbrix

Aus Berufserfahrung. ;)

In dem konkreten Beispiel könnte man etwa recht schmerzfrei und dynamisch zur Programmlaufzeit den Ritter von seinem Pferd absteigen lassen, indem man ihm ein neues "Bewegungsverhalten" gibt. Man tauscht also die Strategie aus.

0
@bluebird5

Ok dachte ich bin hier im Strategie - Muster, wie ich oben geschrieben habe ;)

Aber danke, jetzt habe ich es auch verstanden das es Strategy-Pattern und nicht Strategie Muster heißt.....

0
@Tastaturbrix

Es ist beides dasselbe. Strategie ist doch einfach nur die deutsche Übersetzung für Strategy.

0
@regex9

Mir ist das klar aber ich denke ihm nicht, sollte ironisch gemeint sein....

0
@Tastaturbrix

Oh, hab den Titel der Frage nicht gelesen, sorry. Das ist mir aber auch klar.

1

Sowohl die Grafik als auch das Java-Programm kannst du problemlos in C# umwandeln. Größtenteils ändern sich nur Konventionen (Schreibung der Methodennamen, Klammersetzung) und die Schlüsselwörter virtual und override kommen dazu. Auch die Klassenköpfe ändern sich (Doppelpunkt statt extends/implements).

Beispiel:

abstract class Base
{
  public virtual void DoSomething()
  {
  }
}

class Sub : Base
{
  public override void DoSomething()
  {
  }
}

Zusatzbeispiel, welches für deinen Fall noch etwas relevanter ist, als mein obiger Snippet:

interface Base
{
  void DoSomething();
}

class Sub : Base
{
  public void DoSomething()
  {
  }
}
1

Super Vielen Dank.

Das ich die 2 Schlüsselwörter override und Virtual benötige ist mir entfallen.

In dem beispiel Verwender er das Interface BewegungsVerhalten in der Klasse Einheit.
Kann ich das in C# auch so machen ?
Mir ist nur bekannt das ich die Klasse vom Interface ableiten muss, das ich die aber so verwenden kann, wüsste ich zumindest nicht wie ^^

0
@Tastaturbrix

Das ist normales polymorphes Verhalten.

Hier hast du ein Beispiel, wo es sich genauso verhält:

interface Vehicle
{
  void Move();
}

class Car : Vehicle
{
  public void Move()
  {
    Console.WriteLine("Drive");
  }
}

class Ship : Vehicle
{
  public void Move()
  {
    Console.WriteLine("Swim");
  }
}

// Main:
Vehicle[] vehicles = new Vehicle[] { new Car(), new Ship() };

foreach (Vehicle vehicle in vehicles)
{
  vehicle.Move();
}

Dem Compiler reicht es, dass der Typ von vehicle und die dazu aufgerufene Methode bekannt sind. Wie sie später konkret aufgelöst werden, kann später betrachtet werden.

1
@regex9

Danke, das beispiel hat mir sehr geholfen.

Aber eine sache Verstehe ich nicht:

Wenn ich das beispiel nachbaue, Verwende ich entweder ein Interface oder ich mach es mit virtual und override.

Aber in dem beispiel Verwender er beides, hat das irgend einen Sinn ?
Ich meine ich kann beides gleich erreichen, eine abstract klasse mit virtual, die Sub Klasse hat eine Methode mit override die ich überschreibe wie ich sie benötige.

Jetzt im beispiel mit Interface ist es doch das selbe, fast.

Ich habe ein Interface was eine Methoden Signatur hat, alles was von ableitet kann diese Signatur verwenden.

0
@Tastaturbrix

Interface und abstrakte Klasse sind austauschbar, das stimmt. Daher werden beide Elemente oft generell als Interface bezeichnet. Was für die konkrete Implementation eingesetzt wird, kann man selbst frei entscheiden.

In der Implementation macht es so mehr Sinn, da:

  • Für die Strategy (das Interface mit der bewegen-Methode) nur die Vorschrift der Methode benötigt wird. Der Basistyp Bewegungsverhalten braucht keine weiteren Elemente, für die eine Klasse notwendig wäre.
  • Der Context hingegen beinhaltet zwei Felder, die später von den konkreten Context-Klassen (hier dem Ritter) definiert werden sollen und daher nicht als Konstanten im Interface angelegt werden können. Die abstrakte Klasse eignet sich da eher.
0

Entwurfsmuster (Design Patterns) sind über alle Programmiersprachen hinweg relevant und anwendbar. Ob du das nun in C# oder JAVA oder Go machst.

Außerdem würde ich sagen, dass 90% von dem Code, den du gepostet hast so 1:1 in C# funktioniert. Anstatt "System.out.println" musst du aber wahrscheinlich "Console.WriteLine" benutzen... Und Vererbung geht nicht über das Schlüsselwort "extends" sondern wird mit einem Doppelpunkt eingeleitet. Und anstatt der @Override in JAVA gibt es das Schlüsselwort "override" inline im Methodennamen vor der Deklaration des Rückgabetyps.

Was möchtest Du wissen?