【解決方法】C# インターフェイスでのデフォルト実装の回避


C# のさまざまなクラスに追加機能を統合する方法を探しています。 インターフェイス メソッドのデフォルト実装に焦点を当てるのは良い考えでした。

次のクラス構造を考えてみましょう。

クラス A は、クラス B、C、および D のベースとなります。
クラス E は、クラス F、G、および H のベースです。
クラス O は、クラス P、Q、および R のベースです。

このうち、クラス B、F、および P はインターフェイスを実装する必要があります。 IDoable、メソッドが含まれています X これは、すべての実装クラス間で一貫している必要があります。

簡略化した例を次に示します。

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 :("; 
    }
}

ただし、C# ではインターフェイス メソッドに既定の実装を使用することが望ましいかどうかについては議論があります。 デフォルトの実装に依存せずにこの機能を実現する別のアプローチはありますか? または このシナリオではデフォルト実装の使用は許容されますか?

注: A、E、O には共通の特性がなく、関連性がありません。

私が試したこと:

まず、規定に違反しないように、クラス B、F、および P に X を直接実装することは控えました。 ドライ 原理。 X がこれらのクラス間で同一であることを意図していることを考えると、このアプローチは、特に X が長い場合には実用的ではないと思われました。

次に、X 機能を提供するためにうまく機能する拡張メソッドを作成しました。

C#
public static class DoableExtensions
{
    public static string X(this IDoable doable)
    {
        return "I want to implement method X only once";
    }
}

ただし、このアプローチでは空の結果が得られました。 IDoable に違反するインターフェース 「CA1040: 空のインターフェイスを避ける」 ルール。

最後に考えたのは、 デコレータパターン、しかし、DRY原則を遵守しながら効率的に実装する方法がわかりません。 しかし、このアプローチが重要な解決策である可能性があります。

解決策 1

質問を理論的に保つと、状況が分からない限り具体的な答えを与えることが非常に困難になります。 これは、先生、または就職の面接官が、正解のない質問をして、あなたがどう答えるかを試そうとしているように思えます。

提示されたオプションを見ると、デコレータ パターン 解決策は、3 つの基本クラスすべてに共通の基本クラスまたはインターフェイスがあることを示唆しています。 したがって、拡張メソッドを備えた空のインターフェイスが解決策となる可能性があります。 理由: 複数の具象 (基本/抽象) クラスを継承することはできませんが、複数の (暗黙的/明示的) インターフェイスを実装することはできます。

コメント

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