Menghindari implementasi default di antarmuka C#

pemrograman

[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 IDoableyang mencakup metode X yang harus konsisten di semua kelas pelaksana.

Berikut ini contoh yang disederhanakan:

C#
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:

C#
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]

コメント

タイトルとURLをコピーしました