C #: общая реализация метода не удовлетворяет интерфейсу - PullRequest
4 голосов
/ 02 сентября 2010

В этой публикации, о которой я говорил, я использовал универсальный базовый класс, чтобы позволить мне создавать классы репозитория без дублирования нагрузки основного кода сантехники.

Каждый репозиторий доступен через интерфейс. В приведенном ниже коде для краткости я покажу только один из методов:

Интерфейс:

IQueryable<Suggestion> All { get; }

Базовый базовый класс

public IQueryable<T> All
    {
      get { return _unitOfWork.GetList<T>(); }
    }

Конкретный класс (реализует интерфейс и расширяет базовый базовый класс)

public IQueryable<Suggestion> All
    {
      get { return _unitOfWork.GetList<Suggestion>(); }
    }

Я ожидал, что смогу просто удалить метод из конкретного класса, а компилятор вместо этого будет использовать реализацию базового базового класса и выработать то, что предназначено для удовлетворения интерфейса. Но нет!

Когда я удаляю метод, я получаю старую ошибку «не реализует элемент интерфейса».

Если я не могу этого сделать, мои усилия по использованию базового базового класса не были бессмысленными? Или есть способ обойти это?

Ответы [ 2 ]

6 голосов
/ 02 сентября 2010

Можете ли вы сделать сам интерфейс универсальным, а затем реализовать типизированную версию в вашем конкретном классе?

public interface IRepository<T>
{
    List<T> All { get; }
}

public class Repository<T>
{
      public List<T> All 
      {
          get { return new List<T>(); }
      }
}

public class SuggestionRepository : Repository<Suggestion>, IRepository<Suggestion>
{ }

Я бы по-прежнему предлагал использовать общий интерфейс, поскольку он избавит вас от повторения, но это тоже работает.

public interface ISuggestionRepository
{
    List<Suggestion> All { get; }
}

public class Repository<T>
{
      public List<T> All 
      {
          get { return new List<T>(); }
      }
}

public class SuggestionRepository : Repository<Suggestion>, ISuggestionRepository
{ }
0 голосов
/ 02 сентября 2010

Используйте ключевое слово virtual и поместите ваш интерфейс в конкретную реализацию.

public interface IMyInterface<T>
{
    IQueryable<T> All { get; }
}

public abstract class MyBaseClass<T> : IMyInterface<T>
{
    public virtual IQueryable<T> All
    {
        get { return _unitOfWork.GetList<T>(); ; }
    }
}

public class MyClass : MyBaseClass<Suggestion>, IMyInterface<Suggestion>
{

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