我在这种情况下使用接口主要是作为对象的不可变实例的句柄。问题是不允许在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; }
.....
}
.....
}
我正在寻找替代方案,任何人都有解决方案吗?
答案 0 :(得分:15)
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; }
}
}
答案 1 :(得分:2)
如果ICountryInfo没有理由在ICountry之外存在,那么为什么不应该只将ICountryInfo的属性放在ICountry中并忽略嵌套接口的想法?
没有其他接口而没有自己意义的接口对我来说没有意义,因为如果不是由类实现的话,接口就没用了。
答案 2 :(得分:2)
如果最终目标是使用依赖注入,那么将它们互相注入而不是嵌套有什么问题?
public interface ICountry
{
ICountryInfo Info { get; }
}
public interface ICountryInfo
{
int Population { get; set; }
string Note { get; set; }
}
并实施为:
public class Country : ICountry
{
private readonly ICountryInfo _countryInfo;
public Country(ICountryInfo countryInfo)
{
_countryInfo = countryInfo;
}
public ICountryInfo Info
{
get { return _countryInfo; }
}
}
public class CountryInfo : ICountryInfo
{
public int Population { get; set; }
public string Note { get; set;}
}
然后为ICountry& amp设置绑定后ICountryInfo,CountryInfo将在注入Country时注入Country。
如果需要,您可以限制绑定,只将CountryInfo注入Country和其他地方。 Ninject中的示例:
Bind<ICountry>().To<Country>();
Bind<ICountryInfo>().To<CountryInfo>().WhenInjectedInto<Country>();
答案 3 :(得分:2)
您可以使用如下命名空间:
namespace MyApp
{
public interface ICountry { }
namespace Country
{
public interface ICountryInfo { }
}
}
然后在MyApp
命名空间中,可以使用Country.ICountryInfo
,它很接近您的要求。此外,using alias
有助于使代码清晰。
答案 4 :(得分:1)
这样可以正常工作,无需嵌套:
public interface ICountry
{
ICountryInfo Info { get; }
}
public interface ICountryInfo
{
int Population { get; }
string Note { get; }
}