C# C语言中的接口与多重继承#

C# C语言中的接口与多重继承#,c#,.net,interface,multiple-inheritance,C#,.net,Interface,Multiple Inheritance,我有一组类a和类B都有一些属性。还有另一个C类,它有自己的属性 每当我创建类C的实例时,我都希望使用objClassC访问所有三个类的所有属性 如何在C#中实现这一点 我面临两个问题:- 我不能同时继承C类中的A类和B类(C不支持多重继承) 如果我使用接口而不是类A、B(在接口中我们不能包含字段) 接口可能包含属性,即: public interface IFoo { string Bar { get; set; } } 为什么不在类C中包含类A和类B的实例呢 然后您可以访问 C ob

我有一组类a和类B都有一些属性。还有另一个C类,它有自己的属性

每当我创建类C的实例时,我都希望使用objClassC访问所有三个类的所有属性

如何在C#中实现这一点

我面临两个问题:-

  • 我不能同时继承C类中的A类和B类(C不支持多重继承)
  • 如果我使用接口而不是类A、B(在接口中我们不能包含字段)

  • 接口可能包含属性,即:

    public interface IFoo
    {
        string Bar { get; set; }
    }
    

    为什么不在类C中包含类A和类B的实例呢

    然后您可以访问

    C objc = new C();
    objc.objA.Property1 = "something";
    objc.objB.Property1 = "something from b";
    
    看看这篇文章

    编辑:

    如果我使用接口而不是类A、B(在接口中我们不能 包含字段)

    嗯,接口不能包含字段,如果您定义一个字段,您将得到编译错误。但是接口可以包含属性,但不能指定属性的情况除外,因为接口的所有元素都被视为
    public
    。您可以将接口“A”和“B”的属性定义为:

    public interface IA
    {
         int Property1 { get; set; }
    }
    
    
    public interface IB
    {
        int Property2 { get; set; }
    }
    
    然后您可以在类C中实现它们,如:

    public class C : IA, IB
    {
        public int Property1 { get; set; }
        public int Property2 { get; set; }
    }
    
    稍后,您可以将其用作:

    C objC = new C();
    objC.Property1 = 0;
    objC.Property1 = 0;
    

    接口不是缺少多重继承的解决方案。他们只是不做同样的事情。最接近的方法是使C成为a的子类,并具有类型B的属性。
    也许如果你告诉我们A、B和C应该做什么,我们可以给出一个更适合你需要的答案…

    接口可以有属性,但如果你也想使用这些方法,可能需要组合或依赖注入

    Interface A
    {
       int PropA {get; set;}
    }
    
    
    Interface B
    {
      int PropB {get; set;}
    }
    
    class C : A, B
    {
    
    }
    
    //把这些陈述用某种方法表达出来

    C c = new C();
    c.PropA = 1;
    c.PropB = 2;
    

    接口不能包含字段,但可以包含属性。在大多数情况下,属性可以像字段一样使用,并且说:

    interface ISomeProperties {int prop1 {get;set;}; string prop2 {get; set;}} interface IMoreProperties {string prop3 {get;set;}; double prop4 {get; set;}} interface ICombinedProperties : ISomeProperties, IMoreProperties; { } 给定接口实例,可以执行以下操作:

    theInstance.ActOnThing( (ref int param) => Threading.Interlocked.Increment(ref param) );
    如果只需要对字段执行几种类型的操作,那么将它们简单地包含在接口中是最简单的。另一方面,上面给出的方法允许接口以允许客户端对其执行任意操作序列的方式公开其字段。

    考虑在使用继承组合时,如何以不同方式向客户端公开属性

    继承:

    var myCclass = new Cclass; myClass.propertyA; myClass.propertyB; myClass.propertyC; // and so on 继承提供了一个更干净的API——这是一件好事

    作文要求我了解一些关于班级内部结构的知识——这不是一件好事。这违反了更广为人知的最少知识原则。您可以通过使用一对一公开/返回Bclass和Aclass属性的Cclass属性来解决这个问题,然后您的Bclass和Aclass引用将在Cclass中是私有的或受保护的。Cclass可以完全控制被曝光的内容,而不是依靠A&B不让你不公开的东西曝光

    ,此处不适用于接口


    我也赞同“更喜欢组合而不是继承”。但这是一条指导原则,不是一条硬性规定。

    你可以使用组合。还有@radarbob:部分问题与接口不能包含字段这一事实有关。其他答案承认,在许多情况下,可以使用属性而不是字段。我想进一步说明这样一个事实,即即使想要以属性无法替代的方式使用字段,也可以使用接口。但是如果在C类中必须实现IA,IB,那么实现IA,IB需要什么呢?我们可以在不实现接口的情况下定义属性…?@umarabas,这样做的唯一好处是在IA或IB中持有类
    C
    或实现接口
    IA
    IB
    的任何其他类的对象,并具有多态性行为。上面的代码只是一个例子,我还没有给出一个真实的场景,在这个场景中接口只有一堆属性而没有方法,但是C类有自己的属性。我们也可以在不实现IA,IB的情况下创建类C的对象。那么,为什么我们用接口IA,IB实现类C?如果我们在IA,IB中持有imp类的对象,这是多重继承吗?为什么我们说它是多重继承?当我们仍然需要“多态性”和“组合”时,感谢您的回复!:)@UmarAbbas,在C#中没有多重继承(正如我记得的Java)。上面的例子解释了接口是否可以有属性,并试图通过实现两个接口来模拟多重继承。它不是纯粹的多重继承,在C#中没有办法进行多重继承 delegate void ActionByRef<T1>(ref T1 p1); delegate void ActionByRef<T1,T2>(ref T1 p1, ref T2 p2); delegate void ActionByRef<T1,T2,T3>(ref T1 p1, ref T2 p2, ref T3 p3); interface IThing { // Must allow client code to work directly with a field of type T. void ActOnThing(ActionByRef<T> proc); void ActOnThing<ExtraT1>(ActionByRef<T, ExtraT1> proc, ref ExtraT1 ExtraP1); void ActOnThing<ExtraT1, ExtraT2> (ActionByRef<T> proc, ref ExtraT1 ExtraP1, ref ExtraT2 ExtraP2); } theInstance.ActOnThing( (ref int param) => Threading.Interlocked.Increment(ref param) ); theInstance.ActOnThing( (ref int Param, ref int MaskValue, ref int XorValue) => { int oldValue,newValue; do {oldValue = param; newValue = (oldValue & MaskValue) ^ XorValue; while (Threading.Interlocked.CompareExchange(ref Param, newValue, oldValue) != oldValue), ref maskValue, ref xorValue); ); var myCclass = new Cclass; myClass.propertyA; myClass.propertyB; myClass.propertyC; // and so on
     var myCclass = new Cclass;
        myCclass.bClass.propertyB;
        myCclass.aClass.propertyA;
        myCclass.propertyC;