c# - 多重继承,如何避免手动复制粘贴继承和维护?

标签 c#

我的 WCF Web 服务库在不同端点上公开了 2 个服务:

public interface ICommons
{
    string Common();
}

public interface IFooA : ICommons
{
    string SayFooA();
}

public interface IFooB : ICommons
{
    string SayFooB();
}

及其各自的实现:

public class Commons : ICommons
{
    public string Common() => "Common";
}
public class A : Commons, IFooA
{
    public string SayFooA() => "FooA";
}

public class B : Commons, IFooB
{
    public string SayFooB() => "FooB";
}

我想要第 4 个接口(interface),一个测试接口(interface),它将公开所有方法以便在没有任何引用杂耍的情况下测试它们。

我可以这样定义它:

public interface I_A_B : IFooA, IFooB
{
}

但问题在于这个契约(Contract)的执行。我想使用基类继承,以便起诉我使用相同的实现而无需复制过去和维护。 就像class A使用class Commons一样,Commons实现的任何变化都会在A中继承。

public class A : Commons, IFooA

但是多重继承是不可能的(引用 msdn Why doesn’t C# support multiple inheritance? ) , 所以下一行会导致错误。

public class A_B : A, B, I_A_B

我怎样才能实现 interface I_A_B : IFooA, IFooB ,它使用大部分 class A : Commons, IFooAclass B : Commons, IFooB 用最少的代码复制过去?

最佳答案

公开此类 WCF 接口(interface)的一种方法(如上面评论中所建议的)是:

public class A_B : I_A_B {

    [Import]
    public IFooA A {get; set;}

    [Import]
    public IFooB B {get; set;}

    public string SayFooA() => A.SayFooA();
    public string SayFooB() => B.SayFooB();

...

通过 A 实现 IFooA 方法,通过 B 实现 IFooB 方法。当然,正如您的链接所建议的那样,您必须手动决定哪个实现将调用“Common”方法。

关于c# - 多重继承,如何避免手动复制粘贴继承和维护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59632263/

相关文章:

c# - 打印excel文档时设置打印机托盘

c# - 将热可观察区间转换为冷可观察区间的响应式(Reactive)扩展方法

c# - 如何在 asp.net 中使用 IHttpAsyncHandler 向客户端发送多个确认

c# - IQueryable 不包含 GetAwaiter 的定义

c# - .net 中的逻辑核心编程

c# - ashx 文件的输出(服务器端)缓存

c# - 第三方类未在 'using' 中加载。附加类安装在哪里?

c# - NHibernate JoinQueryOver 条件

C# winforms 透明窗体覆盖问题

c# - 用 C# 编写 XML