Saat ini saya sedang dalam proses mencoba menguasai C #, jadi saya membaca Adaptive Code via C # oleh Gary McLean Hall .
Dia menulis tentang pola dan anti-pola. Di bagian implementasi versus antarmuka ia menulis yang berikut ini:
Pengembang yang baru dengan konsep pemrograman untuk antarmuka sering mengalami kesulitan melepaskan apa yang ada di balik antarmuka.
Pada waktu kompilasi, setiap klien dari suatu antarmuka harus tidak tahu implementasi dari antarmuka yang digunakannya. Pengetahuan tersebut dapat mengarah pada asumsi yang salah yang memasangkan klien ke implementasi antarmuka yang spesifik.
Bayangkan contoh umum di mana kelas perlu menyimpan catatan dalam penyimpanan persisten. Untuk melakukannya, itu benar mendelegasikan ke antarmuka, yang menyembunyikan rincian mekanisme penyimpanan persisten yang digunakan. Namun, tidak benar untuk membuat asumsi tentang implementasi antarmuka mana yang digunakan pada saat run time. Misalnya, casting referensi antarmuka untuk implementasi apa pun selalu merupakan ide yang buruk.
Mungkin kendala bahasa, atau kurangnya pengalaman saya, tapi saya tidak mengerti apa artinya itu. Inilah yang saya mengerti:
Saya punya proyek waktu luang yang menyenangkan untuk berlatih C #. Di sana saya punya kelas:
public class SomeClass...
Kelas ini digunakan di banyak tempat. Saat belajar C #, saya membaca bahwa lebih baik untuk abstrak dengan antarmuka, jadi saya membuat yang berikut ini
public interface ISomeClass <- Here I made a "contract" of all the public methods and properties SomeClass needs to have.
public class SomeClass : ISomeClass <- Same as before. All implementation here.
Jadi saya pergi ke semua referensi kelas dan menggantinya dengan ISomeClass.
Kecuali dalam konstruksi, di mana saya menulis:
ISomeClass myClass = new SomeClass();
Apakah saya mengerti dengan benar bahwa ini salah? Jika ya, mengapa demikian, dan apa yang harus saya lakukan?
ISomeClass myClass = new SomeClass();
? Jika Anda benar-benar bermaksud itu, itu adalah rekursi dalam konstruktor, mungkin bukan yang Anda inginkan. Mudah-mudahan maksud Anda dalam" konstruksi "yaitu alokasi, mungkin, tetapi tidak dalam konstruktor itu sendiri, kan ?
ISomeClass
), tetapi juga mudah untuk membuat antarmuka yang terlalu umum yang tidak mungkin untuk menulis kode yang berguna pada saat itu satu-satunya pilihan adalah untuk memikirkan kembali antarmuka dan menulis ulang kode atau downcast.