Tôi gặp vấn đề về thiết kế mà tôi muốn giải quyết. Tôi có một giao diện, cho phép gọi nó là IProtocol
, được triển khai bởi hai lớp riêng biệt. Chúng tôi đang xem xét hơn 600 dòng mã ở đây. Đại đa số những thứ họ làm là như nhau, trừ đối với một số lĩnh vực cụ thể, như DiffStuff();
Vấn đề thiết kế - Thừa kế đúng cách để đơn giản hóa mã này?
cấu trúc hiện tại là một cái gì đó như thế này:
public class Protocol1 : IProtocol
{
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
Và
public class Protocol2 : IProtocol { MyInterfaceMethod1() { Same1(); Same2(); } }
Tôi lo ngại có lỗi sao chép và dán ông vấn đề cổ điển của mã trùng lặp nếu tôi giữ hai giao thức riêng biệt. Chúng tôi đang nói về một 600 dòng mã đầy đủ, không phải là một số phương pháp đơn giản.
tôi đang xem xét thay đổi việc thực hiện Protocol1 kế thừa từ protocol2, như thế này (Protocol2 chủ yếu sẽ giữ nguyên, ngoại trừ tôi phải quấn Same1()
và Same2()
thành phương pháp tư nhân.)
public class Protocol1 : Protocol2
{
void Same1()
{
base.Same1();
}
void Same2()
{
base.Same2();
}
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
Đây có phải là cách phù hợp để giải quyết vấn đề này không?
Chỉnh sửa: Nhiều người đã giúp tôi với câu hỏi này, cảm ơn sự hiểu biết rõ ràng. Trong trường hợp của tôi, hai đối tượng không cùng loại, mặc dù phần lớn việc triển khai của chúng được chia sẻ, vì vậy tôi đã đi với Bobby's suggestion để sử dụng lớp cơ sở trừu tượng, tạo các phương thức nhỏ để đóng gói các thay đổi giữa các lớp. Bổ sung Nhờ:
- jloubert
- Hans passant
- Jeff xương ức
Tại sao không sử dụng một lớp trừu tượng mà xác định phương pháp chia sẻ và định nghĩa trừu tượng cho những người cần thiết mà không được thực hiện ? – alternative
Hãy xem "Mã sạch" của Robet C. Martin –
Bạn chỉ nên tạo 'Protocol1' kế thừa từ' Protocol2' nếu điều đó thực sự hợp lý. Bạn cần phải hỏi, "là mỗi Protocol1 cũng là một thể hiện của Protocol2, trong cùng một ý nghĩa rằng mỗi con mèo là một động vật có vú?" Nếu có, hãy làm những gì bạn đang suy nghĩ. Nếu không, tôi sẽ đi với một lớp cơ sở trừu tượng, như thể hiện trong câu trả lời của Bobby. – jloubert