Использование списка <interface>в другом интерфейсе C # - PullRequest
5 голосов
/ 14 февраля 2012

Я пытаюсь создать интерфейс для класса модели в ASP.NET MVC2, и мне интересно, могу ли я использовать List<interface> в другом интерфейсе. Будет лучше, если я приведу пример кода.

У меня есть два интерфейса, терминал может иметь несколько отсеков. Поэтому я кодирую свои интерфейсы, как показано ниже.

Интерфейс отсека:

public interface IBay
{
    // Properties
    int id {get; set;}
    string name {get;set;}
    // ... other properties
}

Терминальный интерфейс:

public interface ITerminal
{
    // Properties
    int id {get;set;}
    string name {get;set;}
    // ... other properties
    List<IBay> bays {get;set;}
}

У меня вопрос, когда я реализую свой класс на основе этих интерфейсов, как мне настроить список отсеков. Я собираюсь сделать список отсеков вне интерфейса ITerminal и внутри конкретной реализации?

Моя цель - сделать следующее:

Конкретная реализация:
Залив класса:

class Bay : IBay
{
    // Constructor
    public Bay()
    {
        // ... constructor
    }
}

Класс терминала:

class Terminal : ITerminal
{
    // Constructor
    public Terminal()
    {
        // ... constructor
    }
}

И тогда вы сможете получить доступ к списку отсеков, как это

Terminal.Bays

Любая помощь / предложения будут с благодарностью.

Ответы [ 2 ]

6 голосов
/ 14 февраля 2012

Вы можете инициализировать список интерфейсов, заполнив его конкретными экземплярами. Например, чтобы инициализировать ваш класс Terminal с использованием инициализаторов объектов и коллекций , вы можете использовать код, подобный следующему:

Terminal terminal = new Terminal
{
    id = 0,
    name = "My terminal",
    bays = new List<IBay>
    {
        new Bay { id = 1, name = "First bay" },
        new Bay { id = 2, name = "Second bay" },
        new Bay { id = 3, name = "Third bay" },
    }
};

Некоторые замечания по поводу вашего кода:

  • По соглашению все открытые свойства должны быть PascalCased. Используйте Id или ID вместо id; Name вместо name; Bays вместо bays.
  • Поскольку вы уделяете большое внимание интерфейсам, вам следует рассмотреть возможность изменения типа свойства bays с List<IBay> на IList<IBay>. Это позволило бы потребителям назначать IBay[] массивы для него.
5 голосов
/ 14 февраля 2012

Это должно работать нормально.Просто поймите, что ваш класс Terminal будет по-прежнему содержать List<IBay>, который может заполняться экземплярами Bay по мере необходимости.(Обратите внимание, что я рекомендовал бы вместо этого использовать IList<IBay>.)

Если вы хотите, чтобы терминал возвращал конкретные Bay типы, то вам нужно будет перепроектировать интерфейс терминала и изменить его следующим образом:

public interface ITerminal<T> where T : IBay
{
    // Properties
    int Id {get;set;}
    string Name {get;set;}
    IList<T> Bays {get;}
}

public Terminal : ITerminal<Bay>
{
     private List<Bay> bays = new List<Bay>();
     IList<Bay> Bays { get { return bays; } }
     // ...
     public Terminal()
     {
         bays.Add(new Bay { //...

Тем не менее, добавление этой сложности может быть незначительным.

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