Мне любопытно узнать, почему реализация моего интерфейса в абстрактном базовом классе не удовлетворяет требованиям подклассов. Вот пример:
public interface IBase { }
public interface IConcrete : IBase { }
public interface IBaseManager<out T>
where T : IBase
{
T Create();
IEnumerable<T> SelectAll();
}
public interface IConcreteManager : IBaseManager<IConcrete> { }
public abstract class Base : IBase { }
public class Concrete1 : Base, IConcrete { }
public abstract class BaseManager<T> : IBaseManager<T> where T : class, IBase
{
#region IBaseManager<T> Members
public T Create()
{
throw new NotImplementedException();
}
public IEnumerable<T> SelectAll()
{
throw new NotImplementedException();
}
#endregion
}
public class ConcreteManager : BaseManager<Concrete>, IConcereteManager
{
//error occurs here
}
Это генерируемая ошибка:
'ConsoleApplication4.ConcreteManager' не реализует элемент интерфейса 'ConsoleApplication4.IBaseManager .Create ()'.
«ConsoleApplication4.BaseManager .Create ()» не может реализовать «ConsoleApplication4.IBaseManager .Create ()», поскольку у него нет соответствующего возвращаемого типа «ConsoleApplication4.IConcrete».
Если я добавлю эти методы в класс ConcreteManager
, все будет хорошо, и компилятор будет счастлив.
public new IConcrete Create()
{
return base.Create();
}
public new IEnumerable<IConcrete> SelectAll()
{
return base.SelectAll();
}
Если достаточно просто вернуть то, что возвращают методы из базового класса, зачем добавлять методы? Почему компилятор не может вызывать методы базового класса?