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兼容版本:
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;
}