คุณจะใช้ setter ส่วนตัวอย่างไรเมื่อใช้อินเตอร์เฟส?


139

ฉันได้สร้างส่วนต่อประสานที่มีคุณสมบัติบางอย่าง

หากอินเตอร์เฟสนั้นไม่มีอยู่คุณสมบัติทั้งหมดของอ็อบเจ็กต์คลาสจะถูกตั้งค่าเป็น

{ get; private set; }

อย่างไรก็ตามสิ่งนี้ไม่ได้รับอนุญาตเมื่อใช้อินเทอร์เฟซดังนั้นจะสามารถทำได้และหากเป็นเช่นนั้นได้อย่างไร

คำตอบ:


266

ในอินเทอร์เฟซคุณสามารถกำหนดได้เฉพาะgetterสำหรับคุณสมบัติของคุณ

interface IFoo
{
    string Name { get; }
}

อย่างไรก็ตามในชั้นเรียนของคุณคุณสามารถขยายให้มีprivate setter-

class Foo : IFoo
{
    public string Name
    {
        get;
        private set;
    }
}

1
ดูเหมือนจะไม่บ่นว่า setter เป็นแบบสาธารณะแม้ว่าอินเทอร์เฟซจะประกอบด้วยตัวรับเท่านั้น
Mike Cheel

6
@MikeCheel นั่นเป็นเพราะอินเตอร์เฟสจะกำหนดวิธีการ / ตัวเข้าถึงขั้นต่ำเท่านั้น คุณมีอิสระที่จะเพิ่มมากขึ้นเมื่อคุณใช้วัตถุโดยตรง แม้ว่าเมื่อใช้วัตถุเป็นชนิดอินเตอร์เฟสจะสามารถใช้วิธีการ / accessors ที่กำหนดในส่วนต่อประสานได้เท่านั้น
Marcello Nicoletti

29

อินเตอร์เฟสกำหนด API สาธารณะ หาก public API มีเพียง getter ดังนั้นคุณจะต้องกำหนดเฉพาะ getter ในส่วนต่อประสาน:

public interface IBar
{
    int Foo { get; }    
}

Private setter ไม่ได้เป็นส่วนหนึ่งของ api สาธารณะ (เป็นสมาชิกส่วนตัวอื่น ๆ ) ดังนั้นคุณจึงไม่สามารถกำหนดได้ในส่วนต่อประสาน แต่คุณมีอิสระที่จะเพิ่มสมาชิก (ส่วนตัว) ใด ๆ ในการปรับใช้อินเตอร์เฟส จริงๆแล้วมันไม่สำคัญว่าตัวเซ็ตเตอร์จะถูกใช้งานเป็นสาธารณะหรือส่วนตัวหรือว่าจะมีเซ็ตเตอร์:

 public int Foo { get; set; } // public

 public int Foo { get; private set; } // private

 public int Foo 
 {
    get { return _foo; } // no setter
 }

 public void Poop(); // this member also not part of interface

Setter ไม่ได้เป็นส่วนหนึ่งของส่วนต่อประสานดังนั้นจึงไม่สามารถเรียกผ่านส่วนต่อประสานของคุณได้:

 IBar bar = new Bar();
 bar.Foo = 42; // will not work thus setter is not defined in interface
 bar.Poop(); // will not work thus Poop is not defined in interface
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.