Alex, die meisten Male benötigen Sie mehrere Vererbung ist ein Signal Ihre Objektstruktur ist etwas falsch. In der Situation, die Sie skizziert haben, sehe ich, dass die Klassenverantwortung einfach zu weit gefasst ist. Wenn die Nachricht Teil des Anwendungsgeschäftsmodells ist, sollte die Ausgabe nicht berücksichtigt werden. Stattdessen können Sie die Verantwortung teilen und MessageDispatcher verwenden, der die Nachricht sendet, die mit dem Text- oder HTML-Backend übergeben wurde. Ich weiß nicht, Ihren Code, aber lassen Sie es mich so simulieren:
$m = new Message();
$m->type = 'text/html';
$m->from = 'John Doe <[email protected]>';
$m->to = 'Random Hacker <[email protected]>';
$m->subject = 'Invitation email';
$m->importBody('invitation.html');
$d = new MessageDispatcher();
$d->dispatch($m);
Auf diese Weise können einige Spezialisierung auf Message-Klasse hinzufügen:
$htmlIM = new InvitationHTMLMessage(); // html type, subject and body configuration in constructor
$textIM = new InvitationTextMessage(); // text type, subject and body configuration in constructor
$d = new MessageDispatcher();
$d->dispatch($htmlIM);
$d->dispatch($textIM);
Beachten Sie, dass MessageDispatcher eine Entscheidung treffen würde, ob Als HTML oder als Nur-Text senden, abhängig von type
Eigenschaft in Message-Objekt übergeben.
// in MessageDispatcher class
public function dispatch(Message $m) {
if ($m->type == 'text/plain') {
$this->sendAsText($m);
} elseif ($m->type == 'text/html') {
$this->sendAsHTML($m);
} else {
throw new Exception("MIME type {$m->type} not supported");
}
}
Um es zusammenzufassen, ist die Verantwortung zwischen zwei Klassen aufgeteilt. Die Nachrichtenkonfiguration erfolgt in der InvitationHTMLMessage/InvitationTextMessage-Klasse, und der Sendealgorithmus wird an den Dispatcher delegiert.Dies nennt man Strategy Pattern, mehr dazu lesen Sie unter here.
Es gibt nicht viele Fälle, in denen Vererbung (oder sogar Mehrfachvererbung) gerechtfertigt ist. Sehen Sie sich die SOLID-Prinzipien an. Zusammensetzung vor Vererbung bevorzugen. –
@ OndřejMirtes was meinst du - "nicht viele Fälle, in denen Vererbung gerechtfertigt ist."? – styler1972
Ich meine - Vererbung bringt mehr Probleme als Vorteile (siehe Liskov Substitutionsprinzip). Sie können fast alles mit der Zusammensetzung lösen und viele Kopfschmerzen sparen. Vererbung ist auch statisch - das bedeutet, dass Sie nicht ändern können, was bereits im Code geschrieben ist. Aber Compositition kann zur Laufzeit verwendet werden, und Sie können Implementierungen dynamisch auswählen - e. G. die gleiche Klasse mit unterschiedlichen Caching-Mechanismen wiederverwenden. –