เนื่องจากการสืบทอดหลายครั้งไม่ดี (ทำให้แหล่งซับซ้อนมากขึ้น) C # ไม่ได้จัดรูปแบบดังกล่าวโดยตรง แต่บางครั้งมันจะมีประโยชน์ที่จะมีความสามารถนี้
ตัวอย่างเช่นฉันสามารถใช้รูปแบบการสืบทอดหลายแบบที่ขาดหายไปโดยใช้อินเตอร์เฟสและคลาสสามคลาสดังนี้:
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(); }
}
ทุกครั้งที่ฉันเพิ่มวิธีการหนึ่งในอินเทอร์เฟซที่ฉันต้องการเปลี่ยนคลาสFirstAndSecondเช่นกัน
มีวิธีฉีดคลาสที่มีอยู่หลายคลาสให้เป็นคลาสใหม่อย่างที่เป็นไปได้ใน C ++ หรือไม่
อาจมีวิธีแก้ปัญหาโดยใช้การสร้างรหัสบางประเภทหรือไม่
หรืออาจมีลักษณะเช่นนี้ (ไวยากรณ์ c # ในจินตนาการ):
public class FirstAndSecond: IFirst from First, ISecond from Second
{ }
เพื่อไม่จำเป็นต้องอัปเดตคลาส FirstAndSecond เมื่อฉันแก้ไขหนึ่งในอินเตอร์เฟส
แก้ไข
บางทีอาจเป็นการดีกว่าที่จะพิจารณาตัวอย่างที่ใช้งานได้จริง:
คุณมีคลาสที่มีอยู่ (เช่นไคลเอนต์ TCP แบบข้อความที่อ้างอิงตาม ITextTcpClient) ซึ่งคุณใช้อยู่แล้วในที่ต่างๆในโครงการของคุณ ตอนนี้คุณรู้สึกว่าจำเป็นที่จะต้องสร้างองค์ประกอบของชั้นเรียนของคุณเพื่อให้สามารถเข้าถึงได้ง่ายสำหรับนักพัฒนาแบบฟอร์ม windows
เท่าที่ฉันรู้ว่าคุณมีสองวิธีในการทำเช่นนี้:
เขียนคลาสใหม่ที่สืบทอดจากคอมโพเนนต์และใช้อินเทอร์เฟซของคลาส TextTcpClient โดยใช้อินสแตนซ์ของคลาสเองดังแสดงด้วย FirstAndSecond
เขียนคลาสใหม่ที่สืบทอดมาจาก TextTcpClient และนำ IComponent มาใช้อย่างใด (ยังไม่ได้ลองเลย)
ในทั้งสองกรณีคุณจำเป็นต้องทำงานตามวิธีการและไม่ใช่ต่อชั้นเรียน เมื่อคุณรู้ว่าเราจะต้องใช้วิธีการทั้งหมดของ TextTcpClient และส่วนประกอบมันจะเป็นทางออกที่ง่ายที่สุดในการรวมสองสิ่งเหล่านี้เข้าเป็นหนึ่งคลาส
เพื่อหลีกเลี่ยงความขัดแย้งสิ่งนี้สามารถทำได้โดยการสร้างรหัสซึ่งผลลัพธ์สามารถเปลี่ยนแปลงได้ในภายหลัง แต่การพิมพ์ด้วยมือนั้นเป็นความเจ็บปวดอย่างแท้จริงในตูด