2013-02-28 5 views
1

пример выглядит следующим образом:Как реализовать интерфейс, в котором уже есть некоторые другие интерфейсы?

interface IA 
{ 
    ICollection<IB> Bs {get;set;} 
} 

interface IB 
{ 
} 


public class BBase : IB 
{ 

} 

public class ABase : IA 
{ 
    public ICollection<BBase> Bs { get; set; } 
} 

Вопрос заключается в том, что, когда я хотел реализовать интерфейс IA с BBase, так же, как я сделал в ABase, произошла ошибка. Это можно сказать, что я могу использовать только IB вместо BBase для реализации IA в ABase?

ответ

7

Что вам нужно сделать IA родовыми:

interface IA<T> where T : IB 
{ 
    ICollection<T> Bs { get; set; } 
} 

interface IB 
{ 
} 


public class BBase : IB 
{ 

} 

public class ABase : IA<BBase> 
{ 
    public ICollection<BBase> Bs { get; set; } 
} 

об осуществлении интерфейса должен точно соответствовать его определению, поэтому в необщем случае вы должны иметь ICollection<IB> Bs {get;set;} в ABase точно, то есть он может принять любые из IB проб.

Хотя, когда интерфейс является общим (interface IA<T> where T : IB), это реализация должна обеспечить любой T, удовлетворяющей данное ограничение (то есть здесь некоторая Конкретная реализация IB). Следовательно, класс ABase также станет общим.

Для получения дополнительной информации читайте:

  1. Generic Interfaces (C# Programming Guide)
  2. where (generic type constraint) (C# Reference)
+0

+1 - полезный подход, когда это приемлемо. Изменение общей сигнатуры интерфейса может не работать во всех случаях. –

+0

@AlexeiLevenkov согласен. В этом случае мне кажется, что OP только начинает проектировать – horgh

+0

Спасибо большое! – user2118486

2

Вы не можете реализовать свойство, указав другой тип для него - см Interfaces (C# Programming Guide):

Для реализации член интерфейса, соответствующий член реализации Класс nting должен быть публичным, не статична, и имеют такое же имя и подпись в качестве элемента интерфейса

В вашем конкретном случае вам необходимо либо использовать ICollection<IB> как тип для недвижимости в ABase или следовать Константин Vasilcov предложение о используйте общий IA<T>.

Если вы не можете пойти по универсальному маршруту, подумайте о том, чтобы сделать свойство в интерфейсе «get» - только. Таким образом, вы сможете не предоставлять установщику в классе и проверять все операции «добавить в коллекцию», установив специальные методы для добавления элементов в коллекцию.