避免 C# 接口中的默认实现

[ad_1]

我正在寻找一种将附加功能集成到 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 个基类都有一个公共基类或接口。 因此带有扩展方法的空接口将是可能的解决方案。 原因:您不能继承多个具体(基/抽​​象)类,但可以实现多个(隐式/显式)接口。

[ad_2]

コメント

标题和URL已复制