Wenn Sie den Unterschied verstehen, ist es einfacher zu erklären.
Verfahrenskodex
Ein Beispiel dafür ist PHP ohne die Verwendung von Klassen (insbesondere vor PHP5). Die gesamte Logik ist in einer Reihe von Funktionen kodiert. Sie können andere Dateien mit Hilfsfunktionen usw. einbinden und Ihre Geschäftslogik ausführen, indem Sie Daten in Funktionen weitergeben. Das kann sehr schwer zu handhaben sein, wenn die Anwendung wächst. PHP5 versucht hier Abhilfe zu schaffen, indem es mehr objektorientiertes Design bietet.
Vererbung
Dadurch wird die Nutzung von Klassen gefördert. Die Vererbung ist einer der drei Grundsätze des OO-Designs (Vererbung, Polymorphie, Kapselung).
class Person {
String Title;
String Name;
Int Age
}
class Employee : Person {
Int Salary;
String Title;
}
Das ist Vererbung bei der Arbeit. Der Mitarbeiter "ist eine" Person oder erbt von einer Person. Alle Vererbungsbeziehungen sind "is-a"-Beziehungen. Employee erbt auch die Eigenschaft Title von Person, d. h. Employee.Title gibt den Titel für den Mitarbeiter und nicht für die Person zurück.
Zusammensetzung
Die Komposition wird der Vererbung vorgezogen. Um es ganz einfach auszudrücken, würden Sie haben:
class Person {
String Title;
String Name;
Int Age;
public Person(String title, String name, String age) {
this.Title = title;
this.Name = name;
this.Age = age;
}
}
class Employee {
Int Salary;
private Person person;
public Employee(Person p, Int salary) {
this.person = p;
this.Salary = salary;
}
}
Person johnny = new Person ("Mr.", "John", 25);
Employee john = new Employee (johnny, 50000);
Die Komposition ist in der Regel eine "hat eine" oder "verwendet eine" Beziehung. Hier hat die Klasse Employee eine Person. Sie erbt nicht von Person, sondern bekommt stattdessen das Person-Objekt übergeben, weshalb sie "has a" Person ist.
Komposition über Vererbung
Angenommen, Sie möchten einen Managertyp erstellen, so dass Sie am Ende Folgendes erhalten:
class Manager : Person, Employee {
...
}
Dieses Beispiel wird gut funktionieren, aber was wäre, wenn Person und Employee beide als Title
? Sollte Manager.Title "Manager of Operations" oder "Mr." zurückgeben? Unter Komposition ist diese Mehrdeutigkeit besser aufgehoben:
Class Manager {
public string Title;
public Manager(Person p, Employee e)
{
this.Title = e.Title;
}
}
Das Objekt Manager besteht aus einem Mitarbeiter und einer Person. Das Verhalten "Titel" wird von "Mitarbeiter" übernommen. Durch diese explizite Zusammensetzung wird unter anderem die Mehrdeutigkeit beseitigt, und Sie werden weniger Bugs finden.
6 Stimmen
Siehe auch welches Klassendesign besser ist
6 Stimmen
In einem Satz Vererbung ist öffentlich, wenn Sie eine öffentliche Methode haben und Sie ändern es ändert die veröffentlichte api. wenn Sie Zusammensetzung haben und das Objekt komponiert hat sich geändert, müssen Sie nicht Ihre veröffentlichte api ändern.