Alex, hầu hết các lần bạn cần đa thừa kế là tín hiệu cấu trúc đối tượng của bạn có phần không chính xác. Trong tình huống bạn vạch ra tôi thấy bạn có trách nhiệm lớp học đơn giản là quá rộng. Nếu Thư là một phần của mô hình kinh doanh ứng dụng, thì nó không nên quan tâm đến kết quả hiển thị. Thay vào đó, bạn có thể phân chia trách nhiệm và sử dụng MessageDispatcher gửi thông báo bằng cách sử dụng văn bản hoặc phần phụ trợ html. Tôi không biết mã của bạn, nhưng hãy để tôi mô phỏng nó theo cách này:
$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);
Bằng cách này bạn có thể thêm một số chuyên môn hoá để nhắn lớp:
$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);
Lưu ý rằng MessageDispatcher sẽ đưa ra quyết định liệu có nên gửi dưới dạng HTML hoặc văn bản thuần túy tùy thuộc vào thuộc tính type
trong đối tượng Thư được chuyển.
// 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");
}
}
Tóm lại, trách nhiệm được phân chia giữa hai lớp. Cấu hình thư được thực hiện trong lớp InvitationHTMLMessage/InvitationTextMessage và thuật toán gửi được ủy quyền cho người điều phối.Đây được gọi là Mẫu chiến lược, bạn có thể đọc thêm trên đó here.
Nguồn
2008-09-18 09:53:48
Không có nhiều trường hợp trong đó thừa kế (hoặc thậm chí đa thừa kế) là chính đáng. Xem xét các nguyên tắc SOLID. Ưu tiên thành phần trên thừa kế. –
@ OndřejMirtes những gì bạn có nghĩa là - "không nhiều trường hợp trong đó thừa kế là chính đáng."? – styler1972
Ý tôi là - thừa kế mang lại nhiều vấn đề hơn lợi ích (xem nguyên tắc thay thế Liskov). Bạn có thể giải quyết hầu hết mọi thứ với bố cục và tiết kiệm rất nhiều đau đầu. Thừa kế cũng tĩnh - điều đó có nghĩa là bạn không thể thay đổi nội dung được viết trong mã. Nhưng sự tích hợp có thể được sử dụng trong thời gian chạy và bạn có thể chọn triển khai động - e. g. tái sử dụng cùng một lớp với các cơ chế lưu trữ khác nhau. –