2010-02-18 50 views
16

我在这种情况下主要将接口用作对象的不可变实例的句柄。问题是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; } 
     ..... 
    } 
    ..... 
} 

我正在寻找替代品,任何人都会有一个解决方案?

+1

为什么要'ICountryInfo'嵌套是否有任何特殊原因? – AakashM 2010-02-18 08:45:15

+2

是的,该应用程序包含超过100个类,其中许多嵌套类具有相同的名称。如果我保留这个设置,它会更干净。至于使用接口,这是一种获得不可变对象的方式。一旦对象被实例化,主应用程序主要使用依赖注入模式处理它们相应的接口。 – ericdes 2010-02-18 11:42:07

回答

12

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; } 
    } 
} 
2

这会工作得很好,没有必要窝:

public interface ICountry 
{ 
    ICountryInfo Info { get; } 
} 

public interface ICountryInfo 
{ 
    int Population { get; } 
    string Note { get; } 
} 
+3

是的,但是...这打破了我创建嵌套类的原因。 ICountryInfo不应该在ICountry内的任何地方有意义。 – ericdes 2010-02-18 09:36:35

+8

我同意@ericdes。这是C#失败的情况。 – 2011-06-21 02:10:45

2

如果ICountryInfo没有理由ICountry之外存在,那么为什么你不应该只是把ICountryInfo的性质ICountry和罢免的想法嵌套接口?

没有另一个接口的接口没有自己的意义对我来说没有意义,因为如果不是由类实现的话,接口本身就没有用处。

+0

+1我完全同意。在这个例子中似乎没有必要有一个ICountryInfo。 – Ian 2010-02-18 10:22:42

+0

嗯,我刚刚从一个包含超过100个类的应用程序中提取示例代码,这些类有许多具有相同名称的嵌套类。如果我用嵌套类保留这个设置,它会更加干净。至于使用接口,这是一种获得不可变对象的方式。一旦对象被实例化,主应用程序主要使用依赖注入模式处理它们相应的接口。我不想以一种会导致不实用代码的方式修改嵌套结构。 – ericdes 2010-02-18 11:39:47

+4

尽管我同意给出的例子并不真实,并且可以更好地表达为单个界面,但并不意味着这个想法是无效的。例如,如果ICountry接口具有ICountryInfo对象的集合而不是一个IContryInfo对象,那么它显然无法将其平滑到单个接口中。 ;) – CptRobby 2013-09-27 14:43:18

2

如果最终目标是在依赖注入中使用它,那么将它们插入对方而不是嵌套会出现什么问题?

public interface ICountry 
{ 
    ICountryInfo Info { get; } 
} 

public interface ICountryInfo 
{ 
    int Population { get; set; } 
    string Note { get; set; } 
} 

和实施:一旦您设置绑定ICountry & ICountryInfo每当国家注入,CountryInfo将注入国家

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;} 
} 

然后。

然后,您可以限制绑定,如果你想只将CountryInfo注入到Country和其他地方。 Ninject中的示例:

Bind<ICountry>().To<Country>(); 
Bind<ICountryInfo>().To<CountryInfo>().WhenInjectedInto<Country>();