2017-04-25 31 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; } 
} 

我真的喜歡我的界面不明確二傳手對於MyList來說,因爲只需要從外部獲取getter,因爲您最想實現在MyClass實現中將項目獲取到此列表的邏輯。

0

其他答案是你想要的但仍然不能強迫用戶去做。你只是迫使該實現類將實施IMyInterface的用戶,我仍然可以做

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

這裏FooBar滿足所有的規則,仍然MyListIList<MyClass>類型,但不ILIst<FooBar>類型。