Mengapa C # mengizinkan properti di antarmuka?

47

Di C #, kode berikut ini valid

interface I{
    int property{get;set;}
}

Itu tidak masuk akal bagi saya. Hal ini tampaknya mematahkan salah satu prinsip antarmuka yang paling penting: kurangnya negara (dengan kata lain, tidak ada bidang). Bukankah properti membuat bidang pribadi implisit? Bukankah itu benar-benar buruk untuk antarmuka?

Pasang kembali Monica
sumber
12
Apakah ketiadaan salah satu prinsip implementasi antarmuka ? Bagi saya, antarmuka adalah cara untuk mendefinisikan kontrak, yaitu jika sebuah kelas mengimplementasikan antarmuka tersebut, maka ia memiliki semua metode dan properti yang ditentukan dalam kontrak.
Florian Margaine
4
Properti hanyalah metode get dan metode set. Karena antarmuka hanyalah daftar metode yang harus Anda implementasikan, wajar jika antarmuka dapat memilikinya.
Doval
1
@FlorianMargaine Tentu saja konsep kontrak adalah prinsip antarmuka yang paling penting, tetapi kurangnya status juga penting. Ini membantu memisahkannya dari kelas abstrak. IE di Java 8 ini akhirnya menjadi satu-satunya perbedaan utama antara antarmuka dan kelas abstrak.
Pasang kembali Monica
2
Karena ini bukan bidang. Lihat Mengapa antarmuka C # tidak dapat berisi bidang?
2
@Doval: Adalah wajar bahwa sebuah antarmuka menyatakan metode seperti itu, tetapi tidak mengimplementasikannya.
Giorgio

Jawaban:

65

Saya pikir bagian yang membingungkan adalah bahwa jika Anda menulis int Property { get; set; }di dalam kelas, maka itu adalah properti otomatis dengan bidang dukungan implisit.

Tetapi jika Anda menulis hal yang persis sama dalam sebuah antarmuka, maka itu bukan properti otomatis , itu hanya menyatakan bahwa properti adalah bagian dari antarmuka dan bahwa semua jenis yang mengimplementasikan antarmuka harus mengandung properti itu (sebagai properti otomatis atau tidak ), tetapi tidak membuat bidang dukungan.

Salah satu cara untuk melihat perbedaannya adalah dengan menulis int Property { get; }: ini valid di antarmuka dan menyatakan properti yang hanya memiliki pengambil, tetapi tidak ada penyetel. Tetapi itu tidak akan dikompilasi di kelas (kecuali jika Anda menggunakan C # 6.0), karena properti otomatis harus memiliki setter.

svick
sumber
18

Mendefinisikan properti seperti yang Anda tunjukkan sama dengan mendefinisikan metode int GetProperty()dan void SetProperty(int i). Properti sangat kuat di C #.

Properti tidak secara implisit membuat bidang pribadi dalam C #. Itu adalah implementasi default dari auto-property, misalnya public string MyString { get; set;}- properti yang mendefinisikan logika kustom dalam getmetode tidak menghasilkan bidang pribadi implisit.

Terakhir, karena antarmuka berkaitan dengan API publik , apa bedanya jika implementasi properti antarmuka bergantung pada bidang pribadi - tersirat atau tidak? Itu tersembunyi dari konsumen antarmuka terlepas.

NWard
sumber
Ahh ... Saya tidak menyadari itu hanya terjadi untuk properti otomatis, dan karena Anda harus menimpanya, itu masuk akal. Tetapi jika antarmuka adalah untuk membuat variabel pribadi internal, pelaksana tidak akan memiliki akses ke sana - masalah yang jelas.
Pasang kembali Monica
9
Jika Anda mendefinisikan properti dalam antarmuka C #, implementasi properti tersebut diserahkan kepada kelas pelaksana - mereka dapat menjadikannya properti otomatis, atau mendefinisikan logika khusus sesuai keinginan mereka. Tidak ada bidang yang ditambahkan ke antarmuka .
NWard
10

Properti adalah metode! Bidang dukungan akan ditambahkan ke kelas yang mengimplementasikan antarmuka (baik secara manual atau melalui properti otomatis).

Roman Reiner
sumber
Terkadang tidak ada bidang dukungan. Meskipun akan jarang untuk menentukan get dan set dan tidak memiliki bidang dukungan untuk itu.
Stephen
+1 Properti adalah metode! Iya! Saya suka menulis Propertymethods tetapi rekan kerja peninjau kode tidak melihatnya seperti itu dan kami benar-benar kehilangan peluang untuk beberapa enkapsulasi ekspresif yang bagus dalam program kami.
radarbob
"Metode properti" itu harus cepat, seperti tidak ada pencarian DB atau apa pun. Ada kontrak yang tersirat bahwa akses properti cepat, metode * Get mungkin lambat.
Trey Mack