WHAT 1

  • Softwareunternehmen, welches Bildschirmschoner herstellt
  • Flagship-Produkt: Entensimulation
  • Verschiedene Enten wandern über den Bildschirm

Implementierung

Erweiterung

Lösungsansatz

WHAT ???

Bewertung

  • Das Verhalten der Oberklasse (fliegen) passt nicht für alle Unterklassen
  • Eine lokale Änderung führte zu unerwünschten globalen Nebeneffekten
  • Vererbung erschwert damit die Wartbarkeit des Codes

Vererbung redefined

Vererbung hat Nachteile

Guru Meditation

  • Nimm die sich ändernden Elemente aus dem Code heraus und kapsele sie in eigenen Strukturen
  • Als Ergebnis erhält man mehr Flexibilität und geringere Abhängigkeiten bei Code-Änderungen

Und was bedeutet das jetzt für uns ?

  • fly() und quack() sind die Methoden, deren Implementierung sich zwischen den einzelnen Duck- Klassen ändern kann.
  • Um diese Verhalten zu trennen, nimmt man beide Methoden aus Duck heraus
  • Es werden neue Klassen erzeugt, die dieses Verhalten repräsentieren.

Guru Meditation

  • Interfaces bilden das Verhalten ab.
  • Unterklassen nutzen ein Verhalten, das von einem Interface repräsentiert wird.
  • Tatsächliche Implementierung des Verhaltens wird nicht in den Unterklassen abgebildet, sondern durch die von den Duck-Klassen genutzten konkreten Verhaltensklassen

hä ?

  • Interface bedeutet hier nicht unbedingt Interface-Klasse.
  • Es geht um das Konzept der Schnittstelle bzw. die Nutzung von SuperTypen.
  • Statt der SuperTypen wird in der Implementierung eine konkrete Unterklasse genommen, die für diese Supertypen stehen kann
  • Das Verhalten kann auch mit einer abstrakten Klasse abgebildet werden.

Und wie sieht das jetzt aus

Und was bringt das jetzt ??

  • Mit diesem Design können andere Klassen das Verhalten der Duck-Klassen wiederverwenden, weil es nicht mehr in den Duck-Klassen versteckt ist
  • Neues Verhalten kann hinzugefügt werden, ohne bestehende Verhaltens- oderDuck-Klassen ändern zu müssen

Und jetzt .... wie sieht das jetzt aus ???

Implementierung

Duck


In [ ]:
Behaviours
----------


public abstract class FlyBehaviour
{
    
        public virtual void fly();
    
    
}

public class FlyWithWings: FlyBehaviour
{
        
        public override void fly()
        {
            
            .... your Implementation goes here
        }
        
}

public class FlyNoWay: FlyBehaviour
{
        
        public override void fly()
        {
            
            .... your Implementation goes here
        }
        
}

HAS A IS BETTER THAN IS A


In [1]:
print("Hello")


Hello

  • Ducks erben kein Verhalten, sondern bekommen ein Verhalten hinzugefügt
  • Komplexe Algorithmen können damit ausgelagert und flexibel wiederverwendet werden
  • Das Verhalten kann damit auch zur Laufzeit geändert werden

Klassendiagramm final