Wann implementieren und erweitern? [geschlossen]


89
  • Wann sollte implementoder extendsollte verwendet werden?
  • Was sind einige Beispiele aus der Praxis?

Ist das richtig?

Das Implementieren scheint eine Möglichkeit zu sein, um zu erzwingen, dass bestimmte Methoden in einer Klasse vorhanden sind und dass diese Methodenfunktionsaufrufe ordnungsgemäß formatiert sind. Das Implementieren ist jedoch keine Möglichkeit, Variablen oder "Einstellungen" an die Klasse zu übergeben?

Erwartetes reales Szenario: Ich habe eine E-Commerce-Plattform mit mehreren Zahlungsklassen, die alle dem gleichen Design folgen. Wenn eine neue Zahlungsklasse hinzugefügt werden soll, ist es wirklich einfach, dem definierten Design der zu folgen, interfaceum sicherzustellen, dass alle Teile von Anfang an vorhanden sind.

Durch das Erweitern von Klassen erbt die erweiterte (untergeordnete?) Klasse alles von ihrer übergeordneten Klasse, mit Ausnahme von Methoden und Variablen, die als private? Deklariert sind .

Erwartetes reales Szenario: Ich habe eine Klasse sessionsmit zwei untergeordneten Klassen namens sessioncookiesund aufgerufen databasesessions. sessioncookiesund databasesessionserben zusammen eine Reihe von gegenseitigen Konfigurationsoptionen von ihren übergeordneten Sitzungen, wodurch es einfach ist, eine Konfigurationsoption zu ändern, um alle Arten der eventuellen Speicherung von Besucherdaten zu beeinflussen.


1
Ich empfehle Ihnen, sich über die Vererbung zu informieren.
Rafe Kettler

Antworten:


63

Vererbung ist nützlich, um die Menge an Code zu reduzieren, die Sie neu schreiben. Wenn Sie mehrere Klassen mit einigen gemeinsamen Methoden oder Feldern haben, können Sie diese Methoden und Felder nicht immer wieder definieren, sondern in eine Basisklasse zerlegen und jede der untergeordneten Klassen diese Basisklasse erweitern lassen.

Schnittstellen (und implements) sind nützlich, wenn Sie ein gemeinsames Protokoll für das Verhalten einer Gruppe von Objekten definieren möchten. Beispielsweise möchten Sie möglicherweise festlegen, dass vergleichbare Objekte auf Gleichheit und Hash usw. verglichen werden können.

Die Verwendung der Vererbung ist letztendlich eine Designentscheidung. Halten Sie Ausschau nach Fällen, in denen Sie dieselben Methoden in mehreren Klassen definieren. Dies sind hervorragende Fälle, in denen Sie diese Methoden in eine Basisklasse zerlegen können. Gleiches gilt für Klassen, die einige der gleichen Merkmale aufweisen: Sie können die Konsistenz gewährleisten, indem Sie diese Merkmale in eine Schnittstelle einfügen, die von diesen verwandten Klassen implementiert werden soll.

Vererbung ist ein großes Konzept in OOP, das weit über PHP hinausgeht. Ich empfehle Ihnen, den Wikipedia-Artikel über Vererbung und vielleicht Designmuster der Viererbande zu lesen .

Ich glaube, Ihr Verständnis von Vererbung ist hauptsächlich richtig. Der nächste Schritt wäre, es in der Produktion zu verwenden.


4
Viele Leute betrachten das Buch The Gang of Four als eine Einführung in Designmuster als zu schwer im Material. Eine beliebte Alternative ist Head First: Design Patterns, die das Lesen erleichtern. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan

1
"Halten Sie Ausschau nach Fällen, in denen Sie dieselben Methoden für mehrere Klassen definieren. Dies sind hervorragende Fälle, in denen Sie diese Methoden in eine Basisklasse zerlegen können." Hätte die Erweiterung einer Klasse einen Vorteil gegenüber der Verwendung eines Merkmals zur Definition dieser Methoden?
Daniel Weiner

1
"Vererbung ist nützlich, um die Menge an Code zu reduzieren, die Sie neu schreiben" - Der Zweck der Vererbung besteht darin, das Verhalten zu teilen, nicht den Code. Wenn möglich, sind Merkmale die Möglichkeit, Code gemeinsam zu nutzen, anstatt eine abstrakte Klasse um konkrete Klassen zu erweitern, die sonst nichts gemeinsam haben. Normalerweise können Sie Ihre Klassen auch als eine Beziehung modellieren, die eher eine als eine Beziehung hat, was sowohl die Wiederverwendbarkeit des Codes als auch den Polymorphismus weiter erleichtert.
Duncan

11

Implementieren:

Schnittstellen sind abstrakte Klassen, daher können Sie nur Dinge deklarieren. Eine Klasse implementiert eine Schnittstelle. Sie können mehrere Schnittstellen implementieren .

Erweitern:

Sie erweitern Klassen, wenn Sie eine spezifischere Version einer Klasse wünschen .

Beispiel:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat();
    public void sleep();
}


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

Sowohl Kamel als auch Hund sind Tiere, daher erweitern sie die AnimalKlasse. Aber nur der Hund ist eine bestimmte Art von Animalder auch eine sein kannPet

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.