类型多接口的成员

时间:2010-12-02 15:24:19

标签: .net oop

我正在尝试声明满足多个接口的类型的Property(或函数)。我假设这不能在C#或VB中完成。我的问题是,如果定义一个实现多个接口的类型是有意义的,为什么你不能定义这样的成员呢? 防爆。 我可以这样做

interface IBar
{ String BarMember; }

interface IFoo
{ String FooMember; }

class FooBar : IBar, IFoo
{ 
    public string BarMember{get;set;}
    public string FooMember{get;set;}
}

所以为什么我不能这样做

class SomeClass
{
    public {IBar, IFoo} FooBarMember {get;set;}
}

在这种情况下,FooBar会满足SomeClass.FooBarMember?

我需要这个的原因很简单,我需要一个满足这些接口要求的成员。我不在乎实际的具体课程是什么。 我知道我可以通过创建一个结合了它们的新界面来组合这两个接口,但为什么我必须这样做呢?

2 个答案:

答案 0 :(得分:2)

好的,现在我终于理解了这个问题:救援的仿制药!

class SomeClass<T> where T : IFoo, IBar
{
    public T FooBarMember { get; set; } 
}

现在,FooBarMember的类型为T,这是一种必须同时实现IFooIBar的类型。

考虑一下:

class A : IBar
{
    public string SomeMember { get; set; }
}

class B : IFoo
{
    public string SomeMember { get; set; }
}

class C : IFoo, IBar
{
    public string SomeMember { get; set; }
}

三个类,A实现IBarB实现IFooC实现两者。现在,请使用以下代码:

SomeClass<A> aa = new SomeClass<A>();  // doesn't compile
SomeClass<B> bb = new SomeClass<B>();  // doesn't compile
SomeClass<C> cc = new SomeClass<C>();  // works fine

这意味着我们可以这样做:

SomeClass<C> cc = new SomeClass<C>();
cc.FooBarMember = new C();

答案 1 :(得分:0)

想想你要求编译器做什么:

你说“这个函数返回一个IBar或一个IFoo”。编译器需要知道哪些因为它们具有不同的接口。如果您没有选择特定的那个,那么它无法确定您对该函数的返回值进行的调用是否合法。

告诉我,鉴于您的代码,以下是合法的吗? (答案是“谁知道”):

someClass.FooBarMember.FooMember;

您可以声明实现两者的类型的原因是编译器知道您同时声明了“FooMember”和“BarMember”,因此添加:

IFooBar : IFoo, IBar{ <...> }

表示您声明的任何IFooBar都可以在编译时正确解析对FooMember和BarMember的调用。

C#不是解释性语言。