Общая реализация интерфейса - PullRequest
2 голосов
/ 15 февраля 2009

Почему это не работает?

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. Почему эта реализация не разрешена?

С уважением, Kate

Ответы [ 2 ]

3 голосов
/ 15 февраля 2009

Как ответ на ваш комментарий о том, как получить лучшее из обоих миров; Я думал о чем-то вроде этого, где вы явно реализуете свой интерфейс 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 голосов
/ 15 февраля 2009

Класс PointList должен реализовать интерфейс IPointList. Методы / свойства не могут отличаться только типом возвращаемого значения, что вы пытаетесь сделать с помощью объявления Points в классе PointList. Если вы реализуете

List<TPointType> Points { get; } 

тогда логически вы не сможете реализовать

List<IPoint> Points { get; }

Потому что они будут отличаться только типом возвращаемого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...