2009-02-15 135 views
2

爲什麼不能正常工作?接口的通用實現

public interface IPoint 
{ 
    // not important 
} 

public interface IPointList 
{ 
    List<IPoint> Points { get; } 
} 

public abstract class Point : IPoint 
{ 
    // implemented IPoint 
} 

public abstract class PointList<TPointType> : IPointList 
    where TPointType: IPoint 
{ 
    public abstract List<TPointType> Points { get; } // <- doesn't compile 
} 

TPointType顯然必須是IPoint。爲什麼這個實現是不被允許的?

問候, 凱特

回答

3

作爲對您的評論的回答,關於如何獲得兩全其美; 我正在考慮類似這樣的事情,你在那裏實現你的接口GetPoints屬性,創建一個'更類型化'的GetPoints屬性,以及一個受保護的抽象方法,你可以在具體實現中重寫。
2個屬性調用抽象實現。

public abstract class PointList<T> : IPointList where T : IPoint 
    { 
     public IList<T> GetPoints 
     { 
      get 
      { 
       return GetPointsCore(); 
      } 
     } 

     IList<IPoint> IPointList.GetPoints 
     { 
      get 
      { 
       return GetPointsCore() as IList<IPoint>; 
      }   
     } 

     protected abstract IList<T> GetPointsCore();   
    } 
2

類PointList 應該實現IPointList接口。方法/屬性不能僅僅根據返回類型而不同,這就是你想要用PointList類中的Points聲明做什麼。如果要實現

List<TPointType> Points { get; } 

那麼在邏輯上無法實現

List<IPoint> Points { get; } 

因爲他們也只會返回類型不同。

+0

好的。所以界面 - 就類型而言 - 必須保持原樣。有沒有什麼辦法如何充分利用這兩個世界。所以後代可以有泛型,接口也是滿足的?因爲這種方式我必須有點和其他一些財產清單 GenericPoints? – SmartK8 2009-02-15 11:04:57

+0

使接口通用。 – 2009-02-15 11:32:45