我正在尝试声明满足多个接口的类型的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?
我需要这个的原因很简单,我需要一个满足这些接口要求的成员。我不在乎实际的具体课程是什么。 我知道我可以通过创建一个结合了它们的新界面来组合这两个接口,但为什么我必须这样做呢?
答案 0 :(得分:2)
好的,现在我终于理解了这个问题:救援的仿制药!
class SomeClass<T> where T : IFoo, IBar
{
public T FooBarMember { get; set; }
}
现在,FooBarMember
的类型为T
,这是一种必须同时实现IFoo
和IBar
的类型。
考虑一下:
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
实现IBar
,B
实现IFoo
,C
实现两者。现在,请使用以下代码:
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#不是解释性语言。