Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#带接口的多重继承_C#_Asp.net_Multiple Inheritance - Fatal编程技术网

C#带接口的多重继承

C#带接口的多重继承,c#,asp.net,multiple-inheritance,C#,Asp.net,Multiple Inheritance,如何避免类C中的重复代码。引用:。我不想在C类中再次编写完整的方法。感谢您的帮助。请注意,您根本没有实现多重继承。C#具有单数继承性。您正在实现多个接口 绝对没有理由不能在类A和B中实现接口,然后让B派生自A和C派生自B。接口的方法实现甚至可以是抽象的,这迫使子类执行实现。如果您遵循这种方法,那么您仍然可以通过强制转换或使用as关键字,将C作为IA或IB传递 您还可以使用接口IB“继承”1(实现)IA,这意味着实现IB的任何东西也必须实现IA 1当IB派生自IA时,它不像在类级别那样是继承,实

如何避免类C中的重复代码。引用:。我不想在C类中再次编写完整的方法。感谢您的帮助。

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

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

您还可以使用接口
IB
“继承”1(实现)
IA
,这意味着实现
IB
的任何东西也必须实现
IA




1当
IB
派生自
IA
时,它不像在类级别那样是继承,实际上它仍然是实现。因此,
IB
实现了
IA
,它不继承它。

假设
IA.Calculate()
IB.Calculate()
不同,因此不能只让
IB
继承
IA
,通过在
A
B
的私有实例上委派执行,可以在
C
中实现这两个接口:

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?
}

但你不是在“再次编写完整的方法”。很明显,您正在使用委托并将实现传递给
A
B
的嵌入式实例。是的,您是对的。对不起,也许我用词不对。在C类中,如果possible@KevenDiuliy ? 您希望如何使用类型转换?我想你一定是指别的什么。我想在你的示例类
C
中,你需要显式地实现
IA.Calculate()
IB.Calculate()
。嘿,感谢你的回答,当我试图编译它时,它说“exe不包含适合入口点的静态“Main”方法”。需要在这里添加吗?再次感谢这只是类
C
的定义,很像您在问题中定义的。代码的其余部分(其他类/接口定义、主方法等)与问题中的代码相同
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();
    }
}