สามารถใช้วิธีการขยายกับอินเทอร์เฟซได้หรือไม่?


123

เป็นไปได้ไหมที่จะใช้วิธีการขยายกับอินเทอร์เฟซ (คำถาม C #)

ตัวอย่างเช่นเพื่อให้บรรลุสิ่งต่อไปนี้:

  1. สร้างอินเทอร์เฟซ ITopology

  2. สร้างเมธอดส่วนขยายสำหรับอินเทอร์เฟซนี้ (เช่น public static int CountNodes (ITopology topologyIf นี้))

  3. จากนั้นเมื่อสร้างคลาส (เช่น MyGraph) ซึ่งใช้ ITopology มันจะมีส่วนขยาย Count Nodes โดยอัตโนมัติ

วิธีนี้คลาสที่ใช้อินเทอร์เฟซไม่จำเป็นต้องมีชื่อคลาสที่กำหนดเพื่อให้สอดคล้องกับสิ่งที่กำหนดไว้ในเมธอดส่วนขยาย

คำตอบ:


189

แน่นอนพวกเขาทำได้ Linq ส่วนใหญ่สร้างขึ้นจากวิธีการขยายอินเทอร์เฟซ

อินเทอร์เฟซเป็นหนึ่งในแรงผลักดันในการพัฒนาวิธีการขยาย เนื่องจากไม่สามารถใช้ฟังก์ชันการทำงานของตนเองได้วิธีการขยายจึงเป็นวิธีที่ง่ายที่สุดในการเชื่อมโยงโค้ดจริงกับข้อกำหนดของอินเทอร์เฟซ

ดูEnumerableIEnumerable<T>ชั้นเรียนสำหรับเก็บทั้งวิธีการขยายสร้างขึ้นรอบ ๆ ในการใช้งานจะเหมือนกับการนำไปใช้กับคลาส:

public static class TopologyExtensions
{
    public static void CountNodes(this ITopology topology)
    {
        // ...
    }
}

ไม่มีอะไรแตกต่างเป็นพิเศษเกี่ยวกับวิธีการขยายเท่าที่เกี่ยวข้องกับอินเทอร์เฟซ วิธีการขยายเป็นเพียงวิธีการคงที่ที่คอมไพเลอร์ใช้น้ำตาลวากยสัมพันธ์เพื่อทำให้ดูเหมือนว่าเมธอดเป็นส่วนหนึ่งของประเภทเป้าหมาย


33
Re: "แน่นอน" - ฉันคิดว่าคำถามนี้เผยให้เห็นกลิ่นสถาปัตยกรรมที่คุณกล่าวถึงโดยปริยาย หากคุณสามารถมีส่วนขยายบนอินเทอร์เฟซทำไมอินเทอร์เฟซจึงไม่มีวิธีการใช้งาน เป็นเรื่องที่เข้าใจได้ที่จะคิดว่าอินเทอร์เฟซใด ๆ ควรมีวิธีการที่เป็นรูปธรรมหรือเมื่อคุณรู้ว่าไม่สามารถทำได้ให้คิดว่าไม่ควรอนุญาตให้ใช้วิธีการขยายเป็น kludge ที่ทำงานได้ (แต่เป็นเช่นนั้นไม่เถียงคำตอบที่ยอดเยี่ยมของคุณเพียงแค่ "แน่นอน" และลิงก์ไปยัง IEnum ไม่ใช่LINQ ; ^ D) มีบางอย่างส่งกลิ่นอยู่ที่นั่น!
ruffin

ต้องการเพิ่มข่าวในความคิดเห็น @ruffin ว่าตอนนี้คุณสามารถเพิ่มการใช้งานเริ่มต้นในวิธีการเชื่อมต่อ C # ที่มา: devblogs.microsoft.com/dotnet/…
Vinigas

@ruffin ฉันพบว่านี่เป็นการตัดสินใจทางสถาปัตยกรรมที่สับสนที่สุดใน C # บางครั้งมันก็จบลงด้วยโครงสร้างอินเทอร์เฟซครึ่งคลาสครึ่งหนึ่งที่ยุ่งเหยิงไปทั่ว ถึงกระนั้นฉันเชื่อว่ามันจะมีประโยชน์เมื่อเข้าถึงจากมุมมองการเขียนโปรแกรมเชิงฟังก์ชันและใช้สำหรับการแนะนำยูทิลิตี้ไปยังอินเทอร์เฟซแทนที่จะใช้ฟังก์ชันการทำงาน
Guney Ozsan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.