ใช้สมาชิกอินเทอร์เฟซที่ชัดเจนในคลาส

เสร็จสมบูรณ์เมื่อ

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

อินเทอร์เฟซหลายรายการในคลาส

คลาสใน C# สามารถใช้อินเทอร์เฟซหลายรายการเพื่อให้สามารถสืบทอดลักษณะการทํางานจากแหล่งข้อมูลต่าง ๆ ได้ ความสามารถในการรวมอินเทอร์เฟซหลายรายการเป็นสิ่งสําคัญเนื่องจาก C# ไม่สนับสนุนการสืบทอดของคลาสหลายรายการ การใช้อินเทอร์เฟซหลายตัวช่วยให้คลาสมีคุณลักษณะที่แตกต่างกันและตรวจสอบให้แน่ใจว่าเป็นไปตามกฎที่กําหนดโดยอินเทอร์เฟซเหล่านั้น

  • อินเทอร์เฟซจะกําหนดกลุ่มของฟังก์ชันการทํางานที่เกี่ยวข้อง
  • คลาสหรือหลักต้องใช้สมาชิกทั้งหมดของอินเทอร์เฟซที่สืบทอดมา
  • อินเทอร์เฟซอาจประกอบด้วยวิธีการ คุณสมบัติ เหตุการณ์ และตัวทําดัชนี

ต่อไปนี้คืออินเทอร์เฟซแบบง่ายสองตัวสําหรับตัวอย่างของเรา:

public interface IEnglishDimensions
{
    float Length();
    float Width();
}

public interface IMetricDimensions
{
    float Length();
    float Width();
}

สมาชิกอินเทอร์เฟซที่ชัดเจน

ใน C# คลาสสามารถสืบทอดมาจากระดับเดียวเท่านั้น แต่สามารถใช้อินเทอร์เฟซหลายรายการได้ ซึ่งมีความสําคัญโดยเฉพาะอย่างยิ่งเมื่ออินเทอร์เฟซหลายรายการมีชื่อสมาชิกเดียวกัน เพื่อหลีกเลี่ยงความสับสน เราใช้การใช้งานอินเทอร์เฟซที่ชัดเจน

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

หากต้องการใช้สมาชิกของอินเทอร์เฟซอย่างชัดเจนคุณต้องเพิ่มชื่ออินเทอร์เฟซและรอบระยะเวลาก่อนชื่อสมาชิก ตัวอย่างมีดังนี้:

public class Box : IEnglishDimensions, IMetricDimensions
{
    float IEnglishDimensions.Length()
    {
        return 30.0f;
    }

    float IEnglishDimensions.Width()
    {
        return 20.0f;
    }

    float IMetricDimensions.Length()
    {
        return 76.2f;
    }

    float IMetricDimensions.Width()
    {
        return 50.8f;
    }
}

ในโค้ดBoxนี้ คลาส จะใช้อินเทอร์เฟซสองรายการ: IEnglishDimensions และIMetricDimensions อินเทอร์เฟซทั้งสองมีสมาชิกที่Lengthชื่อและWidth เพื่อหลีกเลี่ยงความสับสนสมาชิกแต่ละคนจะถูกเชื่อมโยงอย่างชัดเจนกับอินเทอร์เฟซ

หมายเหตุ

สมาชิกส่วนติดต่อที่นําไปใช้อย่างชัดเจนไม่มีตัวปรับเปลี่ยนการเข้าถึงเช่น public, private, ฯลฯ สามารถเข้าถึงได้ผ่านอินสแตนซ์ของอินเทอร์เฟซเท่านั้น ไม่ใช่คลาส ซึ่งหมายความว่า คุณไม่สามารถเรียกใช้ Box.Length()แต่คุณสามารถเรียกใช้IEnglishDimensions.Length()ถ้าคุณมีอินสแตนซ์ของBoxที่กําลังถือว่าเป็นIEnglishDimensions

ใช้สมาชิกอินเทอร์เฟซแบบชัดเจน

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

Box box = new Box();
IEnglishDimensions eDimensions = box;
IMetricDimensions mDimensions = box;

Console.WriteLine($"Length in inches: {eDimensions.Length()}");
Console.WriteLine($"Width in inches: {eDimensions.Width()}");
Console.WriteLine($"Length in centimeters: {mDimensions.Length()}");
Console.WriteLine($"Width in centimeters: {mDimensions.Width()}");

ในตัวอย่างนี้ อินสแตนซ์ของ Box คลาสจะถูกแปลงเป็นทั้ง IEnglishDimensions และ IMetricDimensions เพื่อเข้าถึงสมาชิกอินเทอร์เฟซที่ชัดเจน ผลลัพธ์จะแสดงมิติทั้งในภาษาอังกฤษและหน่วยเมตริก

Length in inches: 30
Width in inches: 20
Length in centimeters: 76.2
Width in centimeters: 50.8

ใน C# คุณสามารถใช้อินเทอร์เฟซหลายรายการในคลาสโดยใช้การใช้งานอินเทอร์เฟซที่ชัดเจนเพื่อแก้ไขความขัดแย้งในการตั้งชื่อเมื่อสมาชิกมีลายเซ็นเดียวกัน สมาชิกที่ใช้งานอย่างชัดเจนสามารถเข้าถึงได้ผ่านอินสแตนซ์อินเทอร์เฟซ ไม่ใช่อินสแตนซ์ของคลาส เพื่อให้มั่นใจถึงฟังก์ชันการทํางานที่เหมาะสมและหลีกเลี่ยงความคลุมเครือ วิธีนี้ช่วยเพิ่มความสามารถในการดูแลรักษาโค้ดโดยการกําหนดลักษณะการทํางานที่กําหนดไว้สําหรับแต่ละอินเทอร์เฟซอย่างชัดเจน ทําให้โค๊ดเบสเข้าใจและขยายง่ายขึ้น