Kode pengujian saya dalam C #:
namespace DSnA
{
public abstract class Test : IComparable
{
}
}
Hasil dalam kesalahan kompilator berikut:
error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'
Karena kelas Test
adalah kelas abstrak , mengapa kompiler memerlukannya untuk mengimplementasikan antarmuka? Tidakkah persyaratan ini hanya wajib untuk kelas beton?
c#
syntax
interface
abstract-class
bguiz
sumber
sumber
Jawaban:
Di C #, kelas yang mengimplementasikan antarmuka diperlukan untuk mendefinisikan semua anggota antarmuka itu. Dalam kasus kelas abstrak, Anda cukup mendefinisikan anggota tersebut dengan
abstract
kata kunci:Atau dengan kata lain: Anda tidak harus "menerapkan" itu (yang akan menjadi batasan yang mengerikan pada kelas abstrak); namun, dalam C #, Anda harus memberi tahu kompiler bahwa Anda dengan sengaja menyerahkan uang kepada subkelas beton - dan baris kode di atas menunjukkan cara melakukannya.
Komentar dan downvotes mengeluh bahwa ini bukan jawaban atas pertanyaan yang tidak tepat. Seseorang yang datang ke Stack Overflow, setelah menerima kesalahan kompilator ini, tetapi memiliki kelas abstrak di mana itu akan menjadi kesalahan untuk memasok implementasi, terjebak tanpa solusi yang baik - harus menulis metode implementasi yang melempar pengecualian runtime, sebuah karya yang menghebohkan. -around - sampai mereka memiliki informasi di atas. Baik atau buruknya C # membutuhkan saksi ini di luar lingkup Stack Overflow, dan tidak relevan dengan pertanyaan atau jawaban ini.
sumber
Foo
menjadipublic abstract void IFoo.Bar();
dan Anda mendapat keluhan bahwa "publik" dan "abstrak" bukan pengubah yang valid.Tidak seperti Java, dalam C #: "kelas abstrak harus menyediakan implementasi semua anggota antarmuka yang tercantum dalam daftar kelas dasar kelas. Namun, kelas abstrak diizinkan untuk memetakan metode antarmuka ke metode abstrak."
https://msdn.microsoft.com/en-us/library/Aa664595(v=VS.71).aspx
sumber
Mereka tidak harus benar-benar mengimplementasikan antarmuka .
Metode / properti antarmuka bisa abstrak atau bahkan virtual juga. Jadi terserah pada subclass untuk benar-benar mengimplementasikannya.
sumber