Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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# 尝试继承三个基类并可以';T_C#_Inheritance_Multiple Inheritance - Fatal编程技术网

C# 尝试继承三个基类并可以';T

C# 尝试继承三个基类并可以';T,c#,inheritance,multiple-inheritance,C#,Inheritance,Multiple Inheritance,我有几个问题与我的用户类的设计有关,但是 他们差异很大,我认为他们应该是独立的 问题 因此,第一个与基类的继承有关。我现在 继承两个类,ProfileBase和ISessionMgrEntry,如下所示: public class User : ProfileBase, ISessionMgrEntry 但是,我还想继承第三个类,MembershipUser,如下所示: public class User : ProfileBase, MembershipUser, ISessionMgrEn

我有几个问题与我的
用户
类的设计有关,但是 他们差异很大,我认为他们应该是独立的 问题

因此,第一个与基类的继承有关。我现在 继承两个类,
ProfileBase
ISessionMgrEntry
,如下所示:

public class User : ProfileBase, ISessionMgrEntry
但是,我还想继承第三个类,
MembershipUser
,如下所示:

public class User : ProfileBase, MembershipUser, ISessionMgrEntry
但是,编译器不允许我这样做。为什么?那么,我该怎么做呢 围绕着这个

谢谢

PS-ASP.NET 3.5/C#

编辑

嗨。我认为下面的解决方案可能对我想要实现的目标有效。这看起来非常简单和直接。我这样做是为了创建一个完整/组合的
User
对象。有人知道这会引起问题的原因吗?一个是在我做这个的时候出现的,重叠属性。例如,
MembershipUser
ProfileBase
都共享“
UserName
”。我应该选择一个还是另一个,还是这是一个设计缺陷?建议?再次感谢

公共类用户
{
#区域构造函数
私有只读成员身份用户\u成员身份用户;
私有只读ProfileBase\u ProfileBase;
#端区
公共用户()
{
_MembershipUser=新成员身份用户();
_ProfileBase=新的ProfileBase();
}
公共字符串注释
{
获取{return\u MembershipUser.Comment作为字符串;}
设置{u MembershipUser.Comment=value;}
}
公共福利是不合法的
{
获取{return\u ProfileBase.IsAnonymous as bool;}
} 
....
}

在第一个示例中,您实际上不是从两个类继承,而是从一个类和一个接口继承

C#不允许从类进行多重继承,但允许您实现多个接口。有关原因的更多信息,请参阅(链接已关闭,因此文本粘贴在下面)

您必须创建一个
IMembershipUser
接口,并在
User
类中实现它

接口通常根据前缀为
I
的具体类名命名。因此类
MembershipUser
将具有一个接口
IMembershipUser
。没有什么能阻止您使用其他名称,但使用接口的每个人都习惯于这种命名约定

我们没有实现多目标的原因有很多 直接实现继承。(如您所知,我们支持多个 接口继承)

然而,我应该指出,编译器可以创建 它们在CLR中的类型的MI。如果你需要的话,会有一些粗糙的边缘 走这条路:结果是无法验证的,没有互操作 通过CLS使用其他语言,在V1和V1.1中,您可能会遇到 操作系统加载程序锁的死锁。(我们正在解决最后一个问题, 但前两个问题仍然存在)。技术是生成一些 基于RVA的静态字段中的VTables。为了存放地址 对于托管方法(可能还没有JIT),您可以使用 VTFixup构造。这个结构是一个三元组表。这个 三元组由托管方法的一个令牌组成,即 应该修复的图像(在本例中,是您需要的VTable的插槽) 正在基于RVA(静态)和一些标志中创建。可能的 标志在corhdr.h中描述,它们允许您指定32-vs。 64位指针大小,对虚拟行为的控制,以及 反向的PInvoke行为应该以thunk的形式应用 最终分派到托管方法。如果我们正在执行 非托管->托管转换,您还可以控制 应为我们选择AppDomain以分派呼叫。然而,一个 这些选项中的一个(COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN)没有 存在于V1中。我们在V1.1中添加了它

有几个原因我们没有提供一个烘焙的、可验证的, 多重实现继承的CLS兼容版本:

  • 不同的语言实际上对MI的工作方式有不同的期望。例如,冲突如何解决以及是否重复 基地合并或冗余。在CLR中实现MI之前, 我们必须对所有语言进行调查,找出共同点 并决定如何以语言中立的方式表达这些概念。 我们还必须决定MI是否属于CLS以及属于什么 这意味着不需要这个概念的语言(大概是 例如,VB.NET)。当然,这是我们作为一个整体所从事的业务 公共语言运行库,但我们还没有时间为MI做这件事 然而

  • MI真正合适的地方实际上很少。在许多情况下,多接口继承可以获得 工作完成了。在其他情况下,您可以使用封装 和代表团。如果我们要添加一个稍微不同的构造,比如 mixins,那真的会更强大吗

  • 多重实现继承为实现注入了大量复杂性。这种复杂性会影响铸造、布局, 分派、字段访问、序列化、标识比较、, 可验证性、反射、泛型,可能还有许多其他特性 地方

  • 目前还不清楚这项功能是否能为自己买单。它是 一些我们经常被问到的事情。这是我们应该做的事情 勤奋工作。但我的直觉告诉我,在我们做了深入的研究之后 检查后,我们仍将决定不实现该功能

    C#不支持多重继承

    在第一个示例中,您继承自
    ProfileBase
    ,并声明您的类将在中实现
    ISessionMgrEntry
    class Foo : IEnumerable<object>{
        // explicitly implement IEnumerable.GetEnumerator()
        IEnumerator IEnumerable.GetEnumerator ()
        {
            return GetEnumerator();
        }
    
        public IEnumerator<object> GetEnumerator ()
        {
            yield break;
        }
    }
    
    class Base1 { public abstract void Method1(); } //base class 1
    class Base2 { public abstract void Method2(); } //base class 2
    class Base3 { public abstract void Method3(); } //base class 3
    
    //helper interfaces
    interface IBase1 { Base1 { get; } } 
    interface IBase2 { Base2 { get; } }
    interface IBase3 { Base3 { get; } } 
    
    class Derived: IBase1, IBase2, IBase3 { //derived class
    
      public class D1 : Base1 {  //custom implementation of Base1 class
        public override void Method1() { /* derived Method1 code */ }
      } 
      public class D2 : Base2 {  //custom implementation of Base2 class
        public override void Method2() { /* derived Method2 code */ }
      } 
      public class D3 : Base3 {  //custom implementation of Base3 class
        public override void Method3() { /* derived Method3 code */ }
      } 
    
      //classes as members
      D1 d1;
      D2 d2;
      D3 d3;
      //....
    
      //interface implementation
      public Base1 => d1;
      public Base2 => d2;
      public Base3 => d3; 
    }