[ad_1]
Saya mencari cara untuk mengintegrasikan fungsionalitas tambahan ke berbagai kelas di C#. Berfokus pada implementasi default untuk metode antarmuka adalah ide yang bagus.
Perhatikan struktur kelas berikut:
Kelas A merupakan basis bagi kelas B, C, dan D.
Kelas E merupakan basis dari kelas F, G, dan H.
Kelas O merupakan basis dari kelas P, Q, dan R.
Di antaranya, kelas B, F, dan P harus mengimplementasikan antarmuka IDoable
yang mencakup metode X
yang harus konsisten di semua kelas pelaksana.
Berikut ini contoh yang disederhanakan:
public class A { } public class B : A, IDoable { } public class C : A { } public class D : A { } public class E { } public class F : E, IDoable { } public class G : E { } public class H : E { } public class O { } public class P : O, IDoable { } public class Q : O { } public class R : O { } public interface IDoable { // Yuck, that smells. Default implementation. string X() => "I want to implement method X only once"; } public class Test { public void Run() { string bx = new B().X(); string fx = new F().X(); string px = new P().X(); string result = bx == fx && bx == px ? "Same :)" : "Various :("; } }
Namun, ada perdebatan mengenai apakah penggunaan implementasi default untuk metode antarmuka disarankan di C#. Apakah ada pendekatan alternatif untuk mencapai fungsi ini tanpa bergantung pada implementasi default? Atau apakah penggunaan implementasi default dapat diterima dalam skenario ini?
Catatan: A, E, dan O tidak mempunyai ciri-ciri yang sama dan tidak berhubungan.
Apa yang saya coba:
Pertama, saya menahan diri untuk tidak mengimplementasikan X secara langsung di kelas B, F, dan P untuk menghindari pelanggaran KERING prinsip. Mengingat bahwa X dimaksudkan untuk menjadi identik di seluruh kelas, pendekatan ini tampaknya tidak praktis, terutama jika X panjang.
Kedua, saya membuat metode ekstensi, yang berfungsi dengan baik untuk menyediakan fungsionalitas X:
public static class DoableExtensions { public static string X(this IDoable doable) { return "I want to implement method X only once"; } }
Namun pendekatan ini membuahkan hasil yang kosong IDoable
antarmuka, yang melanggar “CA1040: Hindari antarmuka kosong” aturan.
Terakhir, saya mempertimbangkan Pola dekorator, tapi saya tidak yakin bagaimana menerapkannya secara efisien sambil tetap mematuhi prinsip KERING. Namun mungkin saja pendekatan ini adalah solusi utama.
[ad_2]
コメント