Член типа несколько интерфейсов - PullRequest
0 голосов
/ 02 декабря 2010

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

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 ]

2 голосов
/ 02 декабря 2010

Хорошо, теперь, когда я наконец понял вопрос: дженерики на помощь!

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 голосов
/ 02 декабря 2010

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

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

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

someClass.FooBarMember.FooMember;

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...