2017-04-25 4 views
4

을 상속 항목의 목록을 강제로 나는 다음과 같은 인터페이스가 있습니다C 번호 : 인터페이스 인터페이스

IMyInterface 
{ 
    IList<IMyInterface> MyList { get; set; } 
    int X { get; set; } 
    int Y { get; set; } 
} 

내가 다른 항목의 목록과 목록 "으로 myList"가이 인터페이스를 구현하는 클래스를 강제 할을 IMyInterface 구현. 어떻게해야합니까? 나는 다음과 같은 시도하는 경우

나는 오류를 얻을 :

public class MyClass: IMyInterface 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
    public List<MyClass> MyList { get; set; } 
} 
+1

자체 인터페이스. 이것이 인터페이스와 추상 클래스의 차이점입니다. 그 계약과 당신은 그것에 순종해야합니다. –

+0

현재 코드의 문제점은 무엇입니까? – john

+0

인터페이스를 구현하는 모든 유형의 목록을 갖고 싶습니까? – Rahul

답변

4

MyList의 항목을 구현 유형 클래스로 만들려면 제네릭을 사용해야합니다. 억지를 사용하여 T이 인터페이스를 구현하는 유형이되게하십시오. MyList은 여전히 ​​구현 클래스에서 IList이어야합니다.

IMyInterface<T> where T : IMyInterface<T> 
{ 
    IList<T> MyList { get; set; } 
    int X { get; set; } 
    int Y { get; set; } 
} 

public class MyClass: IMyInterface<MyClass> 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
    public IList<MyClass> MyList { get; set; } 
} 

public class AnotherClass: IMyInterface<MyClass> 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
    public IList<MyClass> MyList { get; set; } 
} 

같은 일을하고 누군가를 중지하지 않습니다하지만 당신이 얻을 수있는만큼 가깝다.

+0

이것은 좋은 질문입니다 : +1 – Ryan

1
public interface IMyInterface<T> 
{ 
    IList<T> MyList { get; set; } 
    int X { get; set; } 
    int Y { get; set; } 
} 
public class MyClass : IMyInterface<MyClass> 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
    public IList<MyClass> MyList { get; set; } 
} 

또는 당신은 다음과 같이 갈 수 있습니다 세터를 정의하지에

public interface IMyInterface<T> 
{ 
    List<T> MyList { get; } 
    int X { get; set; } 
    int Y { get; set; } 
} 
public class MyClass : IMyInterface<MyClass> 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
    public List<MyClass> MyList { get; } 
} 

실제로 내 인터페이스에 대한 선호 MyClass 구현 내에서이 목록에 항목을 가져 오는 논리를 구현하려는 경우 가장 좋아하는 외부에서 getter 만 필요하기 때문입니다.

0

다른 답변은 원하는 것이지만 여전히 사용자가 할 수는 없습니다. 당신은 구현 클래스가 IMyInterface를 구현합니다 사용자를 강제하고 난 여전히 FooBar 만족을 여기에 모든 규칙을

public interface IMyInterface<T> where T : IMyInterface<T> 
{ 
    IList<T> MyList { get; set; } 
    int X { get; set; } 
    int Y { get; set; } 
} 

public class MyClass : IMyInterface<MyClass> 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
    public IList<MyClass> MyList { get; set; } 
} 

public class FooBar : IMyInterface<MyClass> 
{ 
    public IList<MyClass> MyList { get; set; } 
    public int X { get; set; } 
    public int Y { get; set; } 
} 

을 할 수있는, 여전히 MyList는 유형 IList<MyClass>입니다하지만 유형 ILIst<FooBar>의.