接口的通用实现

时间:2009-02-15 10:51:02

标签: c# generics interface

为什么这不起作用?

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。为什么不允许这种实现?

的问候, 凯特

2 个答案:

答案 0 :(得分:3)

作为对你的评论的回答,关于如何充分利用两个世界; 我正在考虑这样的事情,你在那里实现你的接口GetPoints属性,创建一个'更多类型'的GetPoints属性,以及一个可以在具体实现中覆盖的受保护抽象方法。
这两个属性调用抽象实现。

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

答案 1 :(得分:2)

类PointList 应该实现IPointList接口。方法/属性只能通过返回类型而有所不同,这是您尝试使用PointList类中的Points声明进行的操作。如果你实施

List<TPointType> Points { get; } 

然后逻辑上你无法实现

List<IPoint> Points { get; }

因为它们仅因返回类型而不同。