Wenn Sie das Konzept des Polymorphismus verwenden, erstellen Sie eine Klassenhierarchie und rufen mit Hilfe der Elternreferenz die Schnittstellenfunktionen auf, ohne zu wissen, über welchen bestimmten Typ das Objekt verfügt. Das ist toll. Beispiel:
Sie haben eine Sammlung von Tieren und Sie rufen alle Tierfunktionen auf eat
und es ist Ihnen egal, ob es sich um einen Hund oder eine Katze handelt. Aber in der gleichen Klassenhierarchie haben Sie Tiere , die zusätzlichen haben - anders als geerbt und von Klasse implementiert Animal
, zum Beispiel makeEggs
, getBackFromTheFreezedState
und so weiter. In einigen Fällen möchten Sie in Ihrer Funktion möglicherweise den spezifischen Typ kennen, um zusätzliche Verhaltensweisen aufzurufen.
Zum Beispiel, wenn es Morgen ist und wenn es nur ein Tier eat
ist, dann rufst du an , sonst, wenn es ein Mensch ist, rufst du zuerst washHands
an getDressed
und dann erst an eat
. Wie gehe ich mit diesen Fällen um? Polymorphismus stirbt. Sie müssen den Typ des Objekts herausfinden, der sich wie ein Codegeruch anhört. Gibt es einen gemeinsamen Ansatz zur Behandlung dieser Fälle?
Eater
Schnittstelle mit der eat()
Methode definieren, kümmert Human
es Sie als Client nicht, dass eine Implementierung diese zuerst aufrufen muss, washHands()
und getDressed()
es handelt sich um Implementierungsdetails dieser Klasse. Wenn Ihnen als Kunde diese Tatsache am Herzen liegt, verwenden Sie höchstwahrscheinlich nicht das richtige Tool für den Job.
getDressed
vor sich haben muss eat
, was beim Mittagessen nicht der Fall ist. Je nach Ihren Umständen ist dies washHands();if !dressed then getDressed();[code to actually eat]
möglicherweise der beste Weg, um dies für einen Menschen umzusetzen. Eine andere Möglichkeit ist was, wenn andere Dinge das erfordern washHands
und / oder getDressed
genannt werden? Angenommen, Sie haben leaveForWork
? Möglicherweise müssen Sie den Programmfluss so strukturieren, dass er ohnehin schon lange vorher aufgerufen wird.