อัปเดต: คำตอบนี้เขียนขึ้นในปี 2554 หลังจากสองทศวรรษที่มีผู้เสนอความแปรปรวนร่วมประเภทผลตอบแทนสำหรับ C # ดูเหมือนว่าในที่สุดก็จะถูกนำไปใช้ ฉันค่อนข้างแปลกใจ ดูด้านล่างของhttps://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/การประกาศ; ฉันแน่ใจว่าจะมีรายละเอียดตามมา
ดูเหมือนว่าสิ่งที่คุณต้องการคือความแปรปรวนร่วมประเภทผลตอบแทน C # ไม่สนับสนุนความแปรปรวนร่วมประเภทการส่งคืน
ความแปรปรวนร่วมประเภทการส่งคืนคือที่ที่คุณแทนที่เมธอดคลาสพื้นฐานที่ส่งคืนชนิดที่เจาะจงน้อยกว่าโดยที่ส่งกลับประเภทที่เฉพาะเจาะจงมากขึ้น:
abstract class Enclosure
{
public abstract Animal Contents();
}
class Aquarium : Enclosure
{
public override Fish Contents() { ... }
}
สิ่งนี้ปลอดภัยเนื่องจากผู้บริโภคเนื้อหาผ่านสิ่งที่ส่งมาด้วยคาดหวังว่าสัตว์และพิพิธภัณฑ์สัตว์น้ำสัญญาว่าจะไม่เพียงปฏิบัติตามข้อกำหนดนั้น แต่ยิ่งไปกว่านั้นจะให้คำมั่นสัญญาที่เข้มงวดยิ่งขึ้นนั่นคือสัตว์นั้นเป็นปลาเสมอ
C # ไม่รองรับความแปรปรวนร่วมประเภทนี้และไม่น่าจะได้รับการสนับสนุน CLR ไม่รองรับ (ได้รับการสนับสนุนโดย C ++ และโดยการใช้งาน C ++ / CLI บน CLR ทำได้โดยการสร้างเมธอดผู้ช่วยเวทย์มนตร์ของประเภทที่ฉันแนะนำด้านล่าง)
(บางภาษารองรับความแตกต่างของประเภทพารามิเตอร์ที่เป็นทางการเช่นกัน - คุณสามารถแทนที่เมธอดที่ใช้ปลาด้วยวิธีที่ใช้สัตว์ได้อีกครั้งสัญญาจะสำเร็จคลาสพื้นฐานกำหนดให้ต้องจัดการปลาใด ๆ และสิ่งที่ได้มา คลาสสัญญาว่าจะไม่เพียง แต่จับปลาเท่านั้น แต่ยังรวมถึงสัตว์ทุกชนิดในทำนองเดียวกัน C # และ CLR ไม่สนับสนุนการเปลี่ยนแปลงประเภทพารามิเตอร์ที่เป็นทางการ)
วิธีที่คุณสามารถแก้ไขข้อ จำกัด นี้คือทำสิ่งต่างๆเช่น:
abstract class Enclosure
{
protected abstract Animal GetContents();
public Animal Contents() { return this.GetContents(); }
}
class Aquarium : Enclosure
{
protected override Animal GetContents() { return this.Contents(); }
public new Fish Contents() { ... }
}
ตอนนี้คุณจะได้รับประโยชน์ทั้งจากการลบล้างวิธีการเสมือนจริงและการพิมพ์ที่ดีขึ้นเมื่อใช้พิพิธภัณฑ์สัตว์น้ำประเภทคอมไพล์ไทม์