C# 使用区间的多重继承 请考虑附上的附图。

C# 使用区间的多重继承 请考虑附上的附图。,c#,interface,multiple-inheritance,abstraction,C#,Interface,Multiple Inheritance,Abstraction,我想要的是,(技术性的)“用户”可以通过“HeadClass”的实例化使用来自类A、B或C的方法。我试图避免的是,我必须为类a、B和C中定义的每个方法添加一个单独的函数,以便通过“HeadClass”调用它们。昨天,我试图在另一个stackoverflow请求中描述这一点,但删除了它,因为它似乎不清楚我想要实现什么。这是另一种方法 通常这将通过继承来实现(如果只从中继承一个类)。但是,正如他们在那篇被删除的帖子中告诉我的,我应该改用界面。现在,到目前为止,我认为我知道接口是如何工作的(几乎对每个

我想要的是,(技术性的)“用户”可以通过“HeadClass”的实例化使用来自类A、B或C的方法。我试图避免的是,我必须为类a、B和C中定义的每个方法添加一个单独的函数,以便通过“HeadClass”调用它们。昨天,我试图在另一个stackoverflow请求中描述这一点,但删除了它,因为它似乎不清楚我想要实现什么。这是另一种方法

通常这将通过继承来实现(如果只从中继承一个类)。但是,正如他们在那篇被删除的帖子中告诉我的,我应该改用界面。现在,到目前为止,我认为我知道接口是如何工作的(几乎对每个类都使用),但我不知道如何实现这个问题

我该如何填写“头等舱”中的“?”? 我很高兴有任何意见。马上


我已经检查了如何使用接口。但这并不能解决上述问题。

如果我理解正确,您可以在这里使用合成。大概是这样的:

public interface IClass_A
{
    void Method_1 ();
}

public interface IClass_B
{
    void Method_2 ();
    void Method_3 ();
}

public interface IClass_C
{
    void Method_4 ();
}


public interface IHeadClass : IClass_A, IClass_B, IClass_C
{
    void HeadMethod();
}

public class HeadClass : IHeadClass
{
    private readonly IClass_A _a;
    private readonly IClass_B _b;
    private readonly IClass_C _c;

    public HeadClass(IClass_A a, IClass_B b, IClass_C c)
    {
        _a = a;
        _b = b;
        _c = c;
    }

    void HeadMethod()
    {
        ... do head stuff
    }

    public void Method_1() => _a.Method_1();

    public void Method_2() =>  _b.Method_2();
    public void Method_3() =>  _b.Method_3();

    public void Method_4() => _c.Method_4();
}

C(与C++或PHP不同)不支持多重继承。接口允许多重继承,但它们不提供方法的定义,只提供声明

我认为解决方案可以是名为fasade的模式:在
HeadClass
中编写调用其他类中方法的方法。在这种情况下,不需要接口

公共舱头等舱
{
私家班(A);;
私人班(B);;
私家班(C);
公共班长(A类、B类、C类)
{
_a=a;
_b=b;
_c=c;
}
无效方法()
{
…做脑力劳动
}
公共作废方法_1(){
_a、 方法1();
}
公共无效方法_2(){
_b、 方法2();
}
公共作废方法_3(){
_b、 方法3();
}
公共作废方法_4(){
_c、 方法4();
}
}

我可以建议您在构造函数中传递一个接口而不是类定义吗

public class HeadClass
{
    private IMethod1 _method1;
    private IMethod2 _method2;
    private IMethod3 _method3;
    private IMethod4 _method4;

    public HeadClass( IMethod1 method1, IMethod2 method2, IMethod3 method3, IMethod4 method4)
    {
        _method1=method1;
        _method2=method2;
        _method3=method3;
        _method4=method4;
    }

    void HeadMethod()
    {
        ... do head stuff
    }

    public void Method_1 () {
        _method1.Method_1();
    }
    public void Method_2 () {
        IMethod2.Method_2();
    }
    public void Method_3 () {
        IMethod3.Method_3();
    }
    public void Method_4 () {
        IMethod4.Method_4();
    }

}
现在您已经移除了与类的任何直接耦合,您不再仅仅通过接口链接

假设您想将方法2和3拆分为它自己的两个类?这个代码,永远不必更改

现在,您可以将具有接口定义的任何类作为参数重用。没有代码在每个输入中定义两次,即做相同的事情

因为:

public class Method1 : IMethod1
{

}

public class Method2 : IMethod2
{

}

public class Method3 : IMethod3
{

}

public class Method4 : IMethod4
{

}

can now be parsed as parameters to HeadClass.

or, if you insist method 2 & 3 belong on the same class.

public class ClassA: IMethod1
{

}

public class ClassB: IMethod2, IMethod3
{

}

public class ClassC: IMethod4
{

}
从这个例子中可以明显看出,好处在于您现在可以在Headclass中执行任何您想要的操作,并且如果您需要更改行为,您可以通过构造函数注入代码,而不必重试Headclass的行为

而headclass,不知道ClassA、B或C直接存在,只知道接口


我相信这就是所谓的战略模式?

是的,差不多。我只是想摆脱链接public void method_1()=>\u a.method_1()的方法;或者这可能是最低限度的吗?@RadioMan85您可以尝试使用默认接口方法(我个人不会这样做,也取决于实际实现),但除此之外,我不知道有多少选择。看起来你想要的是像traits/mixin这样的东西,而不是C#的一部分。看起来我想要的是像traits/mixin这样的东西(我还不知道这些词)。天哪。没有反馈的“-1”!你怎么敢!我想请你提供一个反馈,说明你为什么给我那个“-1”,或者再次删除它,不再看这篇文章。我尽量不要问愚蠢的问题,有时问正确的问题并不容易,有时问题也不是简单的,而是复杂的。那么,为什么要用“-1”?是的,这是我目前的方法,我不喜欢,因为在我看来,这是多余的代码。但我想我必须在这两种解决方案中做出选择。谢谢你的输入。
public class Method1 : IMethod1
{

}

public class Method2 : IMethod2
{

}

public class Method3 : IMethod3
{

}

public class Method4 : IMethod4
{

}

can now be parsed as parameters to HeadClass.

or, if you insist method 2 & 3 belong on the same class.

public class ClassA: IMethod1
{

}

public class ClassB: IMethod2, IMethod3
{

}

public class ClassC: IMethod4
{

}