Alex, la mayoría de las veces que necesita herencia múltiple es una señal de que la estructura de su objeto es algo incorrecta. En la situación que describiste, veo que tienes una responsabilidad de clase simplemente demasiado amplia. Si Message forma parte del modelo comercial de la aplicación, no debería preocuparse por generar resultados. En su lugar, puede dividir la responsabilidad y usar MessageDispatcher que envía el mensaje pasado usando texto o back-end html. No sé su código, pero déjame simular de esta manera:
$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);
esta manera se puede añadir un poco de especialización a la clase de mensaje:
$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);
Tenga en cuenta que MessageDispatcher tomaría una decisión si se debe enviar como HTML o texto sin formato dependiendo de la propiedad type
en el objeto Message pasado.
// 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");
}
}
Para resumir, la responsabilidad se divide entre dos clases. La configuración del mensaje se realiza en la clase InvitationHTMLMessage/InvitationTextMessage, y el algoritmo de envío se delega al despachador.Esto se llama Patrón de estrategia, puedes leer más sobre él here.
No hay muchos casos en los que la herencia (o incluso la herencia múltiple) sea justificable. Mire los principios SOLIDOS. Prefiere la composición sobre la herencia. –
@ OndřejMirtes ¿a qué te refieres con "pocos casos en los que la herencia es justificable"? – styler1972
Es decir, la herencia trae más problemas que beneficios (observe el principio de sustitución de Liskov). Puedes resolver casi todo con la composición y ahorrar muchos dolores de cabeza. La herencia también es estática; eso significa que no puede cambiar lo que ya está escrito en el código. Pero la composición se puede usar en tiempo de ejecución y puede elegir implementaciones dinámicamente - e. gramo. reutiliza la misma clase con diferentes mecanismos de almacenamiento en caché. –