OOP: Pattern für "Polymorphie von außen"?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Dafür wurde das Besucher Pattern erfunden.
Google mal

Klasse, genau was ich gesucht habe!

Ist zwar nicht mehr ganz so trivial im Quellcode verständlich, aber was nicht geht, geht eben nicht. Danke! :-)

0

Eine Möglichkeit wäre, eine Extension-Method IstZähmbar(this Tier tier) für die Klasse Tier zu erzeugen, welche dann eben dieses Switch-Konstrukt implementiert. Das ist relativ elegant.

Wenn Du natürlich Zugriff auf die Klasse Tier hast, wäre es auch möglich, dies als abstrakte Methode dort hinein zu packen.

Na ja, in meinen Augen ist switch dann immer noch nicht elegant - Erweiterungsmethoden sind ja auch nur syntaktischer Zucker (auch wenn er lecker schmeckt).

Da die Zähmbarkeit von der Implementation des Dompteurs abhängt, erscheint es mir falsch, den Code in die Tier-Klasse zu packen.

Vielleicht wird das Beispiel so abgeändert noch ein wenig einleuchtender:

class Dompteur
{
    int groesse;
    
    bool kannZähmen(Tier tier)
    {
        if (tier is Loewe loewe)
            return !loewe.aggressiv || loewe.groesse < this.groesse;
        else if (tier is Katze katze)
            return katze.kastriert;
        else if (tier is Delphin delphin)
            return delphin.jungtier;
        else
            throw new ArgumentException(...);
    }
}

1
@KnorxyThieus

Ah, ich dachte, es ging generell darum, ob ein Tier gezähmt werden kann. Dann würde das von mir vorgeschlagene Sinn ergeben.

Das von Dir vorgeschlagene ergibt aber nur dann Sinn, wenn die Kriterien, welcher Dompteuer (Instanz) welches Tier dressieren kann auch unterschiedlich sind. Wenn alle Instanzen die Tiere unter denselben Bedingungen zähmen kann, dann ist es doch sinnvoller, generell dem Tier eine Eigenschaft zu geben, ob es überhaupt in irgendeiner Form zähmbar ist.

0
@ohwehohach

Okay, mein Beispiel beginnt zu hinken ^^

Nehmen wir einfach an, dass die Kriterien des Dompteurs unvorhersehbar sind bzw. die Tierklasse de facto keine bessere Schnittstelle bereitstellt.

Gibt es dann noch eine schönere Lösung als if/switch?

0
@KnorxyThieus

Nicht wirklich. Irgendwann kommt ja der Punkt, wo Du aus einem allgemeinen Tier auf ein spezielles Tier kommen musst. Entweder ist also die Tier-Klasse so allgemein gehalten, dass dies eben durch Mittel der Vererbung geschieht, oder sie ist es nicht - dann kommt unweigerlich irgendwann die "if"-Kaskade ins Spiel.

1
@ohwehohach

Eine Überlegung wäre der Tier Klasse eine Funktion zu geben:

bool IsTamable(Tamer tamer);

Die kann in jedem einzelnen Tier dann speziell überschrieben werden. Keine If- oder Switch-Anweisungen. Aber das ist ja nicht, wonach du suchst...

0

Was ist die saubere Form bei einem if-statement ohne else?

Die Frage ist recht simpel. Was ist die saubere Form eines if-statements ohne else?

Was ich normalerweise machen würde, wäre das:

if("Bedingung") { 
    "mach etwas"
}

Aber ich habe von einem Freund gehört, dass das nicht die saubere Variante davon wäre. Besser wäre, wenn man am Ende else hinschreibt ohne dass es etwas macht:

if("Bedingung") { 
    "mach etwas"
} else {
    
}

Was ich auch schon mal gesehen habe, ist die 2 Variante mit einem return im else

if("Bedingung") { 
    "mach etwas"
} else {
    return;
}

Was wäre "offiziell" die richtige Variante?

Cheers
Luke

...zur Frage

OOP (.NET): Kann ich die Sichtbarkeit eines Members beim Überschreiben reduzieren?

Ich habe die folgenden Klassenhierarchie:

class Base
{
    protected abstract void GeneralMember();
}

class Child : Base
{
    protected override void GeneralMember() // <~~ Hier hätte ich gerne ein "privat" stehen
     => SpecificMember();
    
    protected abstract void SpecificMember();
}

class Subchild : Child
{
    protected override void SpecificMember()
     => throw new NotImplementedException();
}

Ich würde die Sichtbarkeiten aber gerne so anpassen, dass Subchild auf die Methode GeneralMember keinen Zugriff mehr hat.

Geht das - oder warum sollte es nicht gehen? Würde mich über eure Erklärung freuen! :-)

...zur Frage

Wofür Switch case?

Warum sollte ich nen switch verwenden anstatt einfach if und else if?

    switch ($variable) {
        case '1':
            # code...
            break;
        case '2':
            # code...
            break;    
        default:
            # code...
            break;
    }

verglichen mit if Verzweigungen ist das doch viel länger

    if($variable == 1) echo 1;
    else if($variable == 2) echo 2;
    else echo 3;
...zur Frage

Java Hamster Simulator Problem

Was ist der Fehler an diesem Code?

boolean linksFrei() { linksUm(); if (vornFrei()) return true else linksUm(); } void main() { linksFrei(); }

Fehler: error: ';' expected if (vornFrei()) return true Zeile: 4

...zur Frage

Ackermann-Funktion in C++ umsetzen

Hallo, ich habe eine Frage zu der Umsetzung der Ackermann-Funktion in C++, und zwar wenn ich die Funktion auf die folgende Weise schreibe:

int acker(int m, int n)
{
     if (m==0)      return ++n;
     else if (n==0) return acker(m-1, 1);
     else           return acker(m-1, acker(m, n-1));
}

dann funktioniert das, wenn ich es aber ohne das else if in der zweiten Zeile schreibe, dann funktioniert es nicht:

int acker(int m, int n)
{
     if (m==0)      return ++n;
     if (n==0)      return acker(m-1, 1);
     else           return acker(m-1, acker(m, n-1));
}

Meiner Überlegung nach müsste das aber egal sein, denn wenn m == 0, dann wird der aktuelle Aufruf der Funktion eh beendet und sonst müsste er ja sowieso zu der Abfrage if(n==0) übergehen, egal ob da ein else davor steht oder nicht.

Vielen Dank schonmal im Vorraus für die Antworten!

...zur Frage

Was ist in PHP der Unterschied zwischen IF-Else und switch?

Ist doch eig. das selbe oder? Könnte ich z.B. auch gut ohne Switch auskommen

...zur Frage

Was möchtest Du wissen?