2010-02-18 4 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

+2

예, 응용 프로그램에는 동일한 이름을 가진 많은 중첩 클래스가있는 100 개 이상의 클래스가 포함되어 있습니다. 내가 그 설정을 유지한다면 훨씬 더 깨끗합니다. 인터페이스 사용에 관해서는, 그것의 불변의 대응 물을 얻는 방법입니다. 객체가 인스턴스화되면 주 응용 프로그램은 주로 종속성 주입 패턴을 사용하여 해당 인터페이스를 처리합니다. – ericdes

답변

12

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 번호는 공변 반환 형식을 지원하지 않습니다 : 그래서, 당신은 당신이 필요로하는 인터페이스 정의와 VB.NET 어셈블리를 만들 수 있습니다

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

이 잘 작동합니다, 둥지 필요가 없습니다 : ICountryInfo이 ICountry 외부에있는 이유가없는 경우

public interface ICountry 
{ 
    ICountryInfo Info { get; } 
} 

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

예,하지만 ... 이것은 중첩 된 클래스를 만든 이유를 무효화합니다. ICountryInfo는 ICountry 내에서와 다른 장소에서 의미가 없어야합니다. – ericdes

+8

나는 @ericdes에 동의한다. 이것은 C#이 실패하는 상황입니다. –

2

, 왜 당신은 그냥 ICountry에 ICountryInfo의 속성을 넣어 아이디어를 기각해서는 안 중첩 된 인터페이스의?

다른 인터페이스없이 자체적으로 의미가없는 인터페이스는 나에게 맞는 것이 아닙니다. 인터페이스 자체가 클래스에 의해 구현되지 않으면 쓸모가 없기 때문입니다.

+0

+1 전적으로 동의합니다. 이 예제에서는 ICountryInfo를 가질 필요가없는 것 같습니다. – Ian

+0

음, 방금 같은 이름을 가진 많은 중첩 클래스를 가진 100 개 이상의 클래스를 포함하는 응용 프로그램에서 샘플 코드를 추출했습니다. 중첩 클래스로 설정을 유지하면 훨씬 더 깨끗합니다. 인터페이스 사용에 관해서는, 그것의 불변의 대응 물을 얻는 방법입니다. 객체가 인스턴스화되면 주 응용 프로그램은 주로 종속성 주입 패턴을 사용하여 해당 인터페이스를 처리합니다. 난 비실용적 인 코드를 초래할 수있는 방식으로 중첩 구조를 수정하고 싶지 않습니다. – ericdes

+4

주어진 예제가 실제로 의미가 없으며 단일 인터페이스로 더 잘 표현된다는 것에 동의하지만 아이디어가 유효하지 않다는 것을 의미하지는 않습니다.예를 들어 ICountry 인터페이스에 ICountryInfo 객체가 하나만있는 것이 아니라면 하나의 인터페이스로 단순화하는 것은 분명하지 않습니다. ;) – CptRobby

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 & ICountryInfo를 들어, CountryInfo이 나라에 주입됩니다 바인딩을 설정하면.

원하는 경우 CountryInfo를 국가에 삽입하고 다른 곳에는 삽입 할 수 없도록 바인딩을 제한 할 수 있습니다. Ninject의 예 :

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