1

Мне не удалось найти подобную проблему, но не стесняйтесь перенаправить меня, если я просто ее пропустил. Я пытаюсь ознакомиться с шаблоном репозитория.Репозиторий C# с несколькими ограничениями и наследованием

Я приведу вам пример кода, который я пытаюсь выполнить неудачно. Это классы и интерфейсы, которые представляют собой объект, который я использую.

public class AbsObj 
{ 
    public string Code { get; set; } 
} 

public interface IAbsObj 
{ 
    bool Save(); 
} 

public class User : AbsObj 
{ 
    public string Language{get; set;} 
} 

public class DbUser : User, IAbsObj 
{ 
    public bool Save() 
    { 
     return true; 
    } 
} 

Затем в хранилище интерфейс

public interface IRepository<T> 
{ 
    void Add(T value); 
    void Update(T value); 
    void Delete(T value); 
} 

Родовое Repository

public class Repository<T> : IRepository<T> where T : AbsObj, IAbsObj 
{ 

    protected List<T> _lst; 

    public Repository() 
    { 
     _lst = new List<T>(); 
    } 
    public void Add(T value) 
    { 

    } 
    public void Update(T value) 
    { 

    } 
    public void Delete(T value) 
    { 

    }   
    public bool Save() 
    { 
     for (int i = 0; i < _lst.Count; i++) 
     { 
      _lst[i].Save(); 
     } 
     return true; 
    } 
} 

Затем более конкретное хранилище, которое должно обрабатывать загрузку пользователей из БД:

public class UserRepository<T> : Repository<T> where T : AbsObj, IAbsObj 
{ 
    public void Load() 
    { 
     DbUser us = new DbUser(); 
     us.Code = "Cod"; 
     us.Language = "IT"; 
     _lst.Add(us); 
    } 
} 

I создал класс DBUser только для того, чтобы иметь возможность создавать XMLUser в будущем, который будет обрабатывать другой тип сбережений. Наследует от пользователя, который в свою очередь наследует от AbsObj. Он реализует IAbsObj. Тем не менее у меня есть ошибка времени компиляции, когда я пытаюсь добавить в список созданный объект DbUser, заявив, что невозможно преобразовать из DBUser в T. Учитывая ограничения, которые я смог выполнить, это было возможно: что мне здесь не хватает? Заранее благодарим за любую помощь!

+0

вы объявленную защищены Список _lst; и пытается добавить DbUser в Load() в этот список без указания , вы не можете это сделать, только когда var repo = new UserRepository (); repo.load(); –

+0

Да, вы правы! Как немой! Как я могу дать вам кредит на правильный ответ в комментарии? – Alberto

ответ

0

Ваше UserRepository определение может быть:

public class UserRepository : Repository<DbUser> 
{ 
    .... 
} 

Но так как вы хотите, чтобы сделать его общим для XMLUser, а также:

public class UserRepository<T> : Repository<T> where T: User, new() 
{ 

    public void Load() 
    { 
     User us = new T() as User; 
     us.Code = "Cod"; 
     us.Language = "IT"; 
     _lst.Add(us); 
    } 
} 

Применение:

new UserRepostitory<DbUser>(); 
    new UserRepostitory<XmlUser>(); 
+0

Извините, но это не сработало :(У меня есть ошибка времени компиляции, так как пользователь не реализует IAbsObj и, следовательно, не имеет метода Save(), который должен быть в репозитории . Другое примечание: если я создаю пользователя а не DbUser во время Load(), я не смогу сэкономить по той же причине. NB: Конечно, я говорю о втором решении. Мне было интересно понять, почему он дает мне ошибку, несмотря на ограничения. – Alberto

+0

Вы должны переместить IAbsObj из DbUser в класс User. Мой пример не создает пользователя, если вы посмотрите на реализацию Load, он создает новый экземпляр типового типа T. T указано, что должно быть создано в моем примере, как используйте его, –

+0

IAbsObj имеет только метод Save(), который должен быть реализован по-разному между словами DbUser и XmlUser. Если я реализую Save() в User, я должен создать метод «mocking» или включить пользователя в абстрактный класс (который будет ld потерял у меня шанс инициализировать его, и я бы предпочел не). Я уже пробовал этот подход, но поскольку он требует создания «бесполезного» метода в лучшем случае, мне было интересно, есть ли другой способ. В другой момент вы правы, я неправильно понял это. – Alberto