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