2010-12-02 6 views
0

Я пытаюсь объявить свойство (или функцию, если на то пошло) типа, который удовлетворяет нескольким интерфейсам. Я предполагаю, что это невозможно сделать на C# или VB. Мой вопрос в том, имеет ли смысл определять тип, реализующий несколько интерфейсов, почему вы не можете определить его члена? Пример. я могу это сделатьMember of type multiple interfaces

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

Этот код не подлежит компиляции.Возможно, вы захотите отредактировать «BarMember» и «FooMember» для автоматического применения свойств: «{String BarMember {get; set;}" – Crisfole 2010-12-02 15:37:23

ответ

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(); 
+0

нет, вы не можете делать "public {IBar, IFoo} FooBarMember {get; set; } Это моя точка зрения. И прочитайте вопрос, пожалуйста: у меня есть решение, я хочу знать, почему IN DESIGN я не могу делать то, что хочу. – Fragilerus 2010-12-02 15:33:43

+0

@Fragilerus: см. обновленный ответ. – 2010-12-02 15:45:14

0

Подумайте о том, что вы просите компилятор сделать:

Вы говорите, «Эта функция возвращает IBar или IFoo». Компилятор нуждается в, чтобы узнать, какие из них имеют разные интерфейсы. Если вы не выбираете какой-либо конкретный, то он не может определить, являются ли вызываемые вами вызовы возвращаемым значением этой функции законными.

Скажите, с учетом вашего кода, является ли следующая юридическая информация? (Ответ: «кто, черт возьми, знает»):

someClass.FooBarMember.FooMember; 

Причина вы можете объявить тип, который реализует как в том, что компилятор знает, что у вас есть и «FooMember» и «BarMember» объявлен в нем, так добавив:

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

Означает, что любое IFooBar вы объявляете может разрешить вызовы на FooMember и BarMember правильно во время компиляции.

C# является не интерпретируемый язык.