Vì nhiều kế thừa là xấu (nó làm cho nguồn phức tạp hơn), C # không cung cấp mẫu trực tiếp như vậy. Nhưng đôi khi nó sẽ hữu ích để có khả năng này.
Chẳng hạn, tôi có thể triển khai mẫu thừa kế bị thiếu bằng cách sử dụng các giao diện và ba lớp như thế:
public interface IFirst { void FirstMethod(); }
public interface ISecond { void SecondMethod(); }
public class First:IFirst
{
public void FirstMethod() { Console.WriteLine("First"); }
}
public class Second:ISecond
{
public void SecondMethod() { Console.WriteLine("Second"); }
}
public class FirstAndSecond: IFirst, ISecond
{
First first = new First();
Second second = new Second();
public void FirstMethod() { first.FirstMethod(); }
public void SecondMethod() { second.SecondMethod(); }
}
Mỗi lần tôi thêm một phương thức vào một trong các giao diện tôi cũng cần thay đổi lớp FirstAndSecond .
Có cách nào để tiêm nhiều lớp hiện có vào một lớp mới giống như trong C ++ không?
Có lẽ có một giải pháp sử dụng một số loại tạo mã?
Hoặc nó có thể trông như thế này (cú pháp c # tưởng tượng):
public class FirstAndSecond: IFirst from First, ISecond from Second
{ }
Vì vậy, sẽ không cần phải cập nhật lớp FirstAndSecond khi tôi sửa đổi một trong các giao diện.
BIÊN TẬP
Có lẽ sẽ tốt hơn nếu xem xét một ví dụ thực tế:
Bạn có một lớp hiện có (ví dụ: máy khách TCP dựa trên văn bản dựa trên ITextTcpClient) mà bạn đã sử dụng tại các vị trí khác nhau trong dự án của mình. Bây giờ bạn cảm thấy cần phải tạo một thành phần của lớp để dễ dàng truy cập cho các nhà phát triển biểu mẫu windows.
Theo tôi biết bạn hiện có hai cách để làm điều này:
Viết một lớp mới được kế thừa từ các thành phần và thực hiện giao diện của lớp TextTcpClient bằng cách sử dụng một thể hiện của chính lớp đó như được hiển thị với FirstAndSecond.
Viết một lớp mới kế thừa từ TextTcpClient và bằng cách nào đó thực hiện IComponent (chưa thực sự thử điều này).
Trong cả hai trường hợp, bạn cần thực hiện công việc theo phương thức chứ không phải mỗi lớp. Vì bạn biết rằng chúng ta sẽ cần tất cả các phương thức của TextTcpClient và Thành phần, đây sẽ là giải pháp đơn giản nhất để kết hợp cả hai thành một lớp.
Để tránh xung đột, điều này có thể được thực hiện bằng cách tạo mã trong đó kết quả có thể được thay đổi sau đó nhưng gõ nó bằng tay là một nỗi đau thuần túy ở mông.