Я использую интерфейсы в этом случае главным образом в качестве дескриптора к неизменному экземпляру объекта. Проблема состоит в том, что вложенные интерфейсы в 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; }
.....
}
.....
}
Я ищу альтернативу, у кого-либо было бы решение?
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; }
}
}
Если ICountryInfo не имеет причин для существования за пределами ICountry, то почему бы вам просто не поместить свойства ICountryInfo в ICountry и отказаться от идеи вложенных интерфейсов?
Интерфейс, который не имеет собственного значения без другой интерфейс для меня не имеет смысла, поскольку сам по себе интерфейс бесполезен, если он не реализован классом.
Это будет работать нормально, вкладывать не нужно:
public interface ICountry
{
ICountryInfo Info { get; }
}
public interface ICountryInfo
{
int Population { get; }
string Note { get; }
}