Bagaimana Anda menerapkan setter pribadi saat menggunakan antarmuka?

139

Saya telah membuat antarmuka dengan beberapa properti.

Jika antarmuka tidak ada, semua properti objek kelas akan diatur ke

{ get; private set; }

Namun, ini tidak diperbolehkan saat menggunakan antarmuka, jadi bisakah ini dicapai dan jika demikian bagaimana?

dotnetnoob
sumber

Jawaban:

266

Di antarmuka Anda hanya dapat menentukan getteruntuk properti Anda

interface IFoo
{
    string Name { get; }
}

Namun, di kelas Anda, Anda dapat memperpanjang untuk memiliki private setter-

class Foo : IFoo
{
    public string Name
    {
        get;
        private set;
    }
}
Rohit Vats
sumber
1
Tampaknya tidak mengeluh jika setter bersifat publik meskipun antarmuka hanya berisi pengambil.
Mike Cheel
6
@MikeCheel Thats karena antarmuka hanya mendefinisikan metode / pengakses minimum. Anda bebas menambahkan lebih banyak saat Anda menggunakan objek secara langsung. Meskipun ketika menggunakan objek sebagai tipe antarmuka hanya metode / accessor yang didefinisikan dalam antarmuka yang bisa digunakan.
Marcello Nicoletti
29

Antarmuka mendefinisikan API publik. Jika API publik hanya berisi pengambil, maka Anda menetapkan hanya pengambil dalam antarmuka:

public interface IBar
{
    int Foo { get; }    
}

Setter pribadi bukan bagian dari api publik (seperti anggota pribadi lainnya), sehingga Anda tidak dapat mendefinisikannya dalam antarmuka. Tetapi Anda bebas menambahkan anggota (pribadi) apa pun ke implementasi antarmuka. Sebenarnya tidak masalah apakah setter akan diimplementasikan sebagai publik atau pribadi, atau jika akan ada setter:

 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 bukan bagian dari antarmuka, sehingga tidak dapat dipanggil melalui antarmuka Anda:

 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
Sergey Berezovskiy
sumber