สืบทอดมาจากคลาสพื้นฐานทั่วไปใช้ข้อ จำกัด และใช้อินเทอร์เฟซใน C #


117

นี่คือคำถามเกี่ยวกับไวยากรณ์ ฉันมีคลาสทั่วไปที่สืบทอดมาจากคลาสพื้นฐานทั่วไปและกำลังใช้ข้อ จำกัด กับพารามิเตอร์ชนิดหนึ่ง ฉันยังต้องการให้คลาสที่ได้รับมาใช้อินเทอร์เฟซ สำหรับชีวิตของฉันดูเหมือนว่าฉันไม่สามารถเข้าใจไวยากรณ์ที่ถูกต้องได้

นี่คือสิ่งที่ฉันมี:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }

สิ่งแรกที่นึกถึงคือ:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }

แต่นั่นไม่ถูกต้องเนื่องจากทำให้ T2 จำเป็นต้องใช้ทั้ง IBar และ IFoo ไม่ใช่ DerivedFoo เพื่อใช้ IFoo

ฉันได้ลองใช้ Googling ใช้เครื่องหมายทวิภาคอัฒภาค ฯลฯ แล้ว แต่กลับสั้นลง ฉันแน่ใจว่าคำตอบนั้นง่ายมาก


ฉันไม่เข้าใจคำตอบของ @ Adam เมื่อฉันดูครั้งเดียว แต่หลังจากผ่านไป 2 นาทีฉันก็รู้ว่ามันคืออะไรขอบคุณสำหรับคำตอบ คลาสที่ได้รับมีการใช้งานมากกว่าหนึ่งครั้งอาจเป็นประเด็นนี้ อย่างไรก็ตามฉันต้องการแสดงสัญกรณ์สำหรับผู้อื่น "class DerivedClass <Type>: ParentClass โดยที่ Type: IType" ไม่ควรอยู่ระหว่างคลาสที่ใช้งานล่าสุดและที่ข้อ
nurisezgin

คำตอบ:


173

คุณรวมลายเซ็นทั้งหมดของชั้นเรียนก่อนที่จะกำหนดข้อ จำกัด ทั่วไป

class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar
{
    ...
}

5
สำหรับคนอื่นฉันได้สร้างสิ่งนี้ให้เป็นภายในเนื่องจากคลาสจะได้รับเพียงหนึ่งที่ส่วนคำสั่งและต่อท้ายสำหรับข้อ จำกัด ประเภททั่วไปใด ๆ และทั้งหมด
Andy V

@Visser ได้รับอนุญาตให้มีหลายส่วนโดยที่ clauses, class Test <T1, T2> โดยที่ T1: Interface1 โดยที่ T2: Interface2
bwing

@Visser ใช่สิ่งที่ BWing กล่าวนอกจากนี้แต่ละประโยคสามารถมีข้อ จำกัด ได้หลายข้อ ... ดังนั้นไวยากรณ์จากโพสต์ต้นฉบับจึงถูกต้องมันก็หมายถึงสิ่งที่แตกต่างออกไปตามที่ op ต้องการ where T2 : IBar, IFoo ก็หมายความว่าT2ต้องใช้ทั้งสองอินเทอร์เฟซแทนDerivedFoo<T1,T2> การใช้IFoo
v01pe

18

คำแนะนำของฉัน: เมื่อคุณมีคำถามเกี่ยวกับไวยากรณ์ของภาษา C # โปรดอ่านข้อกำหนด นั่นคือเหตุผลที่เราเผยแพร่ คุณจะต้องอ่านหัวข้อ 10.1

เพื่อตอบคำถามเฉพาะของคุณลำดับของสิ่งต่างๆในการประกาศชั้นเรียนคือ:

  • แอตทริบิวต์ในวงเล็บเหลี่ยม
  • ตัวปรับแต่ง ("สาธารณะ" "คงที่" และอื่น ๆ )
  • "บางส่วน"
  • "ชั้น"
  • ชื่อชั้นเรียน
  • รายการประกาศพารามิเตอร์ชนิดที่คั่นด้วยเครื่องหมายจุลภาคภายในวงเล็บมุม
  • เครื่องหมายจุดคู่ตามรายการประเภทฐานที่คั่นด้วยเครื่องหมายจุลภาค (คลาสฐานและอินเทอร์เฟซที่ใช้งานคลาสฐานต้องไปก่อนหากมี)
  • พิมพ์ข้อ จำกัด พารามิเตอร์
  • ร่างกายของชั้นเรียนล้อมรอบด้วยไม้ค้ำยัน
  • อัฒภาค

ทุกอย่างในรายการนั้นเป็นทางเลือกยกเว้น "คลาส" ชื่อและเนื้อหา แต่ทุกอย่างจะต้องปรากฏตามลำดับนั้นหากปรากฏ


95
เอริคในขณะที่ฉันเคารพคุณในฐานะมืออาชีพอย่างมากและขอขอบคุณสำหรับความคิดเห็นของคุณ แต่ฉันอดไม่ได้ที่จะหงุดหงิดกับสิ่งที่พบว่าเป็นคำตอบที่ไม่สุภาพ คุณกำลังวิจารณ์ฉันที่เลือกถามคำถามในไซต์ถาม - ตอบเกี่ยวกับการเขียนโปรแกรมเกี่ยวกับการค้นหาการดาวน์โหลดและการค้นหาผ่านเอกสาร Word 503 ที่มีเทคนิคขั้นสูงซึ่งฝังอยู่ในลิงก์ใน MSDN ค่อนข้างหยาบ นี่เป็นการใช้เวลาอย่างมีประสิทธิภาพสูงสุดและมีประโยชน์เพิ่มเติมที่อาจช่วยคนอื่นได้ในภายหลัง ลิงก์ไปยัง C # Lang Spec สำหรับผู้ที่สนใจคือ: msdn.microsoft.com/en-us/vcsharp/aa336809.aspx
Dan Rigby

17
ไม่มีเจตนาวิจารณ์ มีความลำเอียงแพร่หลายในการสื่อสารด้วยข้อความบริสุทธิ์ซึ่งทำให้คำพูดง่ายๆของข้อเท็จจริงฟังดูหยาบคายและรุนแรง ฉันพยายามอ่านอย่างมีเสน่ห์เมื่อนำเสนอรายการข้อเท็จจริงที่เป็นประโยชน์และแนะนำให้คุณทำเช่นนั้นด้วย ฉันปฏิบัติตามคำแนะนำของฉัน หากคุณมีคำถามเกี่ยวกับไวยากรณ์ข้อมูลจำเพาะจะตอบคำถามเหล่านี้อย่างชัดเจนและเริ่มต้นด้วยสารบัญที่เป็นประโยชน์สำหรับการค้นหาคำจำกัดความของไวยากรณ์ที่เฉพาะเจาะจง
Eric Lippert

3
Dan การค้นหาข้อมูลจำเพาะ C # ทำได้ง่ายเพียงป้อน 'C # Spec' ใน Google แล้วกดปุ่ม 'ฉันโชคดี' และหากคุณเป็นนักพัฒนา C # มืออาชีพคุณควรมีข้อมูลจำเพาะ C # ในรูปแบบ PDF ในเครื่องของคุณอยู่แล้ว นอกจากนี้ฉันไม่ได้ตั้งใจจะวิพากษ์วิจารณ์คุณเช่นกัน ฉันไม่คุ้นเคยกับการอ่านข้อมูลจำเพาะก่อนหน้านี้ แต่ฉันได้เริ่มอ่านแล้วขอบคุณ Jon, Eric และ Pavel ที่มักจะพูดถึง C # spec สำหรับคำถามใด ๆ ฉันพบว่าข้อมูลจำเพาะ C # แม้ว่าบางครั้งอาจอ่านยาก แต่ก็เป็นวิธีที่ดีในการเรียนรู้ภาษา
SolutionYogi

@Eric Lippert: พอใช้ ขอบคุณสำหรับการตอบกลับของคุณ. เพื่อเป็นข้อเสนอแนะเชิงสร้างสรรค์จะเป็นประโยชน์หาก Microsoft จะรวมเนื้อหาของข้อกำหนดเข้ากับ MSDN โดยตรงนอกเหนือจากการดาวน์โหลดแยกต่างหาก Visual Studio .Net เวอร์ชัน MSDN มีข้อกำหนดเฉพาะในเวอร์ชันรวม แต่ไม่ใช่เวอร์ชันที่ใหม่กว่า ฉันเคยคิดที่จะซื้อหนังสือของ Anders Hejlberg แต่ด้วย. Net 4.0 ที่อยู่ใกล้ ๆ ฉันยังลังเลที่จะทำ amazon.com/C-Programming-Language-3rd/dp/0321562992ขอบคุณ
Dan Rigby

2
C ++ กำหนดให้การประกาศคลาสลงท้ายด้วยอัฒภาค นักพัฒนา C # จำนวนมากมาจากพื้นหลัง C ++ บางครั้งนิ้วของพวกเขาก็ใส่อัฒภาคโดยที่สมองของพวกเขาไม่ได้เข้าไปเกี่ยวข้อง :-) มีโครงสร้างจำนวนมากใน C # ซึ่งใช้ตัวเลือกกึ่งที่ C ++ ต้องการ เป็นเพียงความสะดวกสบายเล็กน้อย ฉันคิดว่ามันยังช่วยให้คุณสามารถโทรออกอย่างละเอียดเมื่อการประกาศประเภทสิ้นสุดลงเทียบกับพูดการประกาศเนื้อหาวิธีการ
Eric Lippert


2
public class KeyAndValue<T>
{
    public string Key { get; set; }
    public virtual T Value { get; set; }
}

public class KeyAndValue : KeyAndValue<string>
{
    public override string Value { get; set; }
}

นี่คือส่วนขยายจากคำตอบที่มีอยู่ ค่าเริ่มต้นคือstringถ้าคุณไม่ระบุประเภท ฉันไม่ได้ใช้อินเทอร์เฟซ แต่ไม่ควรต้องการอะไรที่แตกต่างไปจากปกติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.