Saya ingin tahu apakah suatu kelas dapat mewarisi dari kelas dan antarmuka. Contoh kode di bawah ini tidak berfungsi, tetapi saya pikir itu menyampaikan apa yang ingin saya lakukan. Alasan saya ingin melakukan ini adalah karena di perusahaan saya, kami membuat perangkat USB, serial, Ethernet, dll. Saya mencoba mengembangkan komponen / antarmuka umum yang dapat saya gunakan untuk menulis program untuk semua perangkat kami yang akan membantu menjaga hal-hal umum (seperti menyambungkan, memutuskan sambungan, mendapatkan firmware) sama untuk semua aplikasi kami.
Untuk menambah pertanyaan ini: Jika GenericDevice berada dalam proyek yang berbeda, dapatkah saya menempatkan antarmuka IOurDevices dalam proyek itu kemudian membuat kelas USBDevice mengimplementasikan antarmuka jika saya menambahkan referensi ke proyek pertama? Karena ingin hanya merujuk satu proyek dan kemudian mengimplementasikan antarmuka yang berbeda tergantung pada perangkat apa.
class GenericDevice
{
private string _connectionState;
public connectionState
{
get{return _connectionState; }
set{ _connectionState = value;}
}
}
interface IOurDevices
{
void connectToDevice();
void DisconnectDevice();
void GetFirmwareVersion();
}
class USBDevice : IOurDevices : GenericDevice
{
//here I would define the methods in the interface
//like this...
void connectToDevice()
{
connectionState = "connected";
}
}
//so that in my main program I can do this...
class myProgram
{
main()
{
USBDevice myUSB = new USBDevice();
myUSB.ConnectToDevice;
}
}
sumber
Jawaban:
Iya. Mencoba:
Catatan: Kelas dasar harus ada sebelum daftar nama antarmuka.
Tentu saja, Anda masih perlu mengimplementasikan semua anggota yang didefinisikan oleh antarmuka. Namun, jika kelas dasar berisi anggota yang cocok dengan anggota antarmuka, anggota kelas dasar dapat berfungsi sebagai implementasi anggota antarmuka dan Anda tidak diharuskan untuk mengimplementasikannya lagi secara manual.
sumber
USBDevice : IOurDevice
. Menambahkan implementasi secara eksplisit tidak berdampak pada kelas dasar, tetapi dapat membantu memberikan penekanan pada antarmuka.Tidak, tidak juga. Tapi itu bisa mewarisi dari kelas dan mengimplementasikan satu atau lebih antarmuka.
Terminologi yang jelas penting ketika membahas konsep-konsep seperti ini. Salah satu hal yang akan Anda lihat menandai tulisan Jon Skeet, misalnya, baik di sini maupun di media cetak, adalah bahwa ia selalu tepat dalam cara ia mendeskripsikan sesuatu.
sumber
Tidak terkait dengan pertanyaan (jawaban Mehrdad seharusnya membuat Anda pergi), dan saya harap ini tidak dianggap sebagai nitpicky: kelas tidak mewarisi antarmuka, mereka mengimplementasikannya .
.NET tidak mendukung multiple-inheritance, jadi menjaga persyaratan tetap lurus dapat membantu dalam komunikasi. Kelas dapat mewarisi dari satu superclass dan dapat mengimplementasikan sebanyak mungkin antarmuka yang diinginkan.
Menanggapi komentar Eric ... Saya berdiskusi dengan pengembang lain tentang apakah antarmuka "mewarisi", "mengimplementasikan", "mengharuskan", atau "membawa" antarmuka dengan deklarasi seperti:
Jawaban teknisnya adalah karena
ITwo
mewarisiIOne
beberapa alasan:ITwo
implementasinyaIOne
salahITwo
mewarisiIOne
metode, jikaMethodOne()
adaIOne
maka itu juga dapat diakses dariITwo
. yaitu:((ITwo)someObject).MethodOne())
valid, meskipunITwo
tidak secara eksplisit mengandung definisi untukMethodOne()
typeof(IOne).IsAssignableFrom(typeof(ITwo))
kembalitrue
Kami akhirnya setuju bahwa antarmuka mendukung pewarisan sejati / penuh. Fitur warisan yang hilang (seperti penggantian, abstrak / virtual accessors, dll) hilang dari antarmuka, bukan dari warisan antarmuka. Itu masih tidak membuat konsepnya sederhana atau jelas, tetapi membantu memahami apa yang sebenarnya terjadi di balik tudung di dunia Eric :-)
sumber
Saya menemukan jawaban untuk bagian kedua dari pertanyaan saya. Ya, sebuah kelas dapat mengimplementasikan antarmuka yang ada di kelas yang berbeda selama antarmuka tersebut dinyatakan sebagai publik.
sumber
class ContainsAll { private interface INested { /* ... */ } private class MyExample : INested { /* ... */ } }
,MyExample
kelas mengimplementasikan antarmuka pribadi bersarang. Dalam contoh lain, antarmuka bersarang (dan kelas yang mengandung) bisa menjadiinternal
. Itu semua tergantung pada siapa yang perlu menggunakannya dan peduli dengan mereka.