【问题标题】:C# Multiple Inheritance with Interfaces带有接口的 C# 多重继承
【发布时间】:2013-03-31 07:19:58
【问题描述】:
public interface IA
{
  void DoSomething();
  void Calculate();

}

public interface IB
{
  void DoSomethingElse();
  void Calculate();
}

public class A : IA
{
  void DoSomething() { }
  void Calculate() {}
}

public class B : IB
{
  void DoSomethingElse() { }
  void Calculate() {}
}

public class C : IA, IB
{

    //How can I implement Calculate() in class B and DoSomething() in class A?
}

如何避免 C 类中的重复代码。参考:How to simulate multiple inheritance in C#。我不想在 C 类中再次编写完整的方法。感谢您的帮助。

【问题讨论】:

  • 但您不是“再次编写完整的方法”。您显然正在使用委托并将实现传递给 A 和 B 的嵌入式实例。
  • 是的,你是对的。对不起,也许我措辞不正确。在 C 类中,如果可能,我想使用类型转换而不是“public void DoSomething(){m_A.DoSomething();}”
  • @KevenDiuliy Type cast?你想如何使用类型转换?我想你一定是别的意思。
  • 我认为在您的示例类C 中,您需要明确实现IA.Calculate() 和IB.Calculate()。

标签: c# asp.net multiple-inheritance


【解决方案1】:

假设IA.Calculate() 与IB.Calculate() 不同,因此您不能让IB 继承自IA,您可以通过委派@ 的私有实例执行C 中的两个接口987654326@和B:

public class C : IA, IB
{
    private A _a;
    private B _b;

    public C()
    {
        this._a = new A();
        this._b = new B();
    }

    public void DoSomething()
    {
        this._a.DoSomething();
    }
    void IA.Calculate()
    {
        this._a.Calculate();
    }
    public void DoSomethingElse()
    {
        this._b.DoSomethingElse();
    }
    void IB.Calculate()
    {
        this._b.Calculate();
    }
}

【讨论】:

  • 嘿,感谢您的回复,当我尝试编译它时,它说“exe 不包含适合入口点的静态“主要”方法”。需要在这里添加吗?再次感谢
  • 这只是类C 的定义,就像您在问题中定义的一样。其余代码(其他类/接口定义、Main 方法等)与您在问题中所使用的一样
【解决方案2】:

请注意,您根本没有实现多重继承。 C# 具有单数继承。您正在实现多个接口。

绝对没有理由不能实现类A和B中的接口,然后让B派生自A和C从B派生。从接口实现的方法可以甚至是抽象的,这迫使子类执行实现。如果您遵循这种方法,那么您仍然可以通过转换或使用 as 关键字将 C 传递为 IA 或 IB。

你也可以有接口IB"inherit"1(实现)IA,这意味着任何实现IB的东西也必须实现IA。



1 当IB 派生自IA 时,它不像在类级别那样继承,它实际上是仍然执行。所以IB 实现 IA,它不会继承它。

【讨论】:

    猜你喜欢
    • 2011-03-02
    • 2012-12-07
    • 2022-08-12
    • 2015-11-14
    • 2013-02-07
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多