嵌套接口的替代方法(在C#中不可能)

时间:2010-02-18 08:43:01

标签: c# interface

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

我正在寻找替代方案,任何人都有解决方案吗?

5 个答案:

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