Tôi muốn giữ cái này ngắn gọn. Tôi xây dựng một HouseA có hai phòng, nói BedRoom
và StudyRoom
, cả hai đều xuất phát từ một lớp cơ sở được gọi là Room
. BedRoom
và StudyRoom
có cùng một phụ huynh được gọi là House
. Ngoài ra, bất kỳ phòng nào trong một căn nhà đều có thể truy cập bất kỳ phòng nào khác chỉ thông qua phụ huynh. Nếu BedRoom
phải truy cập vào bất kỳ thuộc tính nào của StudyRoom
, nó phải chỉ đi qua House
(tức là cha mẹ) và ngược lại.Tôi có nên sử dụng thừa kế hoặc sáng tác không?
HouseA ISA House
HouseA HAS BedRoom and StudyRoom.
BedRoom ISA Room
StudyRoom ISA Room
Bây giờ Vấn đề: Hãy nói rằng, tôi xây dựng một ngôi nhà (nói HouseB
), mà là một chính xác giống như trên, nhưng với một sự thay đổi. Tôi không muốn có hai phòng riêng biệt (ví dụ: BedRoom
và StudyRoom
), nhưng thay vào đó là một phòng đơn (MasterRoom
) có cả hai cơ sở này. Vì lợi ích của sử dụng lại mã, tôi có thể nghĩ đến các phương án thiết kế như sau:
Option-1:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
Ở đây tôi mất khả năng tái sử dụng các thuộc tính của BedRoom
và StudyRoom
rằng tôi đã tạo cho HouseA
. Lưu ý rằng hầu hết các thuộc tính của BedRoom
và StudyRoom
cần phải được thực hiện lại trong MasterRoom
, do đó dẫn đến sao chép mã.
Option-2:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
MasterRoom HAS LogicalBedroom
MasterRoom HAS LogicalStudyRoom
LogicalBedroom ISA BedRoom
LogicalStudyRoom ISA StudyRoom
Bằng cách này, tôi sử dụng thành phần để tôi có thể tái sử dụng hầu hết mã của tôi (Tôi có vài ngàn dòng mã mà tôi có thể tái sử dụng), nhưng vấn đề là BedRoom
là một lớp bê tông và logicalBedRoom
có thể tìm thấy một số thuộc tính không phù hợp và có thể buộc phải ghi đè lên các phương thức để chúng không làm gì cả. Ví dụ: Bedroom->noOfSides() = 4
và logicalBedRoom->noOfSides() = ??
. Đây có phải là một sử dụng tốt của thừa kế?
Thiết kế thực tế của tôi là dành cho một chip phức hợp kết hợp chức năng của hai chip riêng lẻ (tôi đã sử dụng Nhà (bo mạch chủ) và tương tự Room (chip)). Tôi mã trong Object Oriented Perl và tôi thực sự sẽ đánh giá cao bất kỳ đề xuất thiết kế thay thế.
Cảm ơn
Có vai trò giống như Mixin trong Ruby không? – rpattabi
@ ragu.pattabi, vai trò tương tự như mixin. Sự khác biệt chính là các vai trò có một số điều khiển khi chúng có thể được áp dụng - các vai trò có thể yêu cầu các phương thức nhất định có sẵn trong một lớp tiêu thụ. Có những khác biệt khác nữa. Perl sử dụng các thuật ngữ vai trò bản đồ để 'đặc điểm' trong thế giới lớn hơn của nghiên cứu OO. Trong Perl/Moose một đặc điểm là một vai trò được áp dụng cho một phương thức sử dụng giao thức siêu đối tượng, nằm ngoài phạm vi của trả lời này. Tôi nâng cao điểm để tôi có thể tránh sự xuất hiện của trình tự không phải là trình tự như tôi hướng dẫn bạn đến một tài nguyên về các đặc điểm nói chung: http://scg.unibe.ch/research/traits/ – daotoad
Điều đó có nghĩa là vai trò cung cấp cơ chế như phương thức mẫu mô hình không có hành lý thừa kế. Điều đó khá thú vị. – rpattabi