Альтернативы вложенным интерфейсам (не возможный в C#)

Я использую интерфейсы в этом случае главным образом в качестве дескриптора к неизменному экземпляру объекта. Проблема состоит в том, что вложенные интерфейсы в C# не позволяются. Вот код:

public interface ICountry
{
    ICountryInfo Info { get; }

    // Nested interface results in error message:
    // Error    13  'ICountryInfo': interfaces cannot declare types
    public interface ICountryInfo
    {
        int Population { get; }
        string Note { get; }
    }
}


public class Country : ICountry
{
    CountryInfo Info { get; set; }

    public class CountryInfo : ICountry.ICountryInfo
    {
        int Population { get; set; }
        string Note { get; set; }
        .....
    }
    .....
}

Я ищу альтернативу, у кого-либо было бы решение?

20
задан ericdes 18 February 2010 в 08:43
поделиться

3 ответа

VB.NET позволяет это сделать. Так, вы можете создать сборку VB.NET только с теми определениями интерфейса, которые вам нужны:

Public Interface ICountry
  ReadOnly Property Info() As ICountryInfo

  Public Interface ICountryInfo
    ReadOnly Property Population() As Integer
    ReadOnly Property Note() As String
  End Interface
End Interface

Что касается реализации, C# не поддерживает ковариантные типы возврата, поэтому вы должны объявить свой класс так:

public class Country : ICountry {
  // this property cannot be declared as CountryInfo
  public ICountry.ICountryInfo Info { get; set; }

  public class CountryInfo : ICountry.ICountryInfo {
    public string Note { get; set; }
    public int Population { get; set; }
  }
}
17
ответ дан 30 November 2019 в 00:59
поделиться

Если ICountryInfo не имеет причин для существования за пределами ICountry, то почему бы вам просто не поместить свойства ICountryInfo в ICountry и отказаться от идеи вложенных интерфейсов?

Интерфейс, который не имеет собственного значения без другой интерфейс для меня не имеет смысла, поскольку сам по себе интерфейс бесполезен, если он не реализован классом.

2
ответ дан 30 November 2019 в 00:59
поделиться

Это будет работать нормально, вкладывать не нужно:

public interface ICountry
{
    ICountryInfo Info { get; }
}

public interface ICountryInfo
{
    int Population { get; }
    string Note { get; }
}
1
ответ дан 30 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: