У меня нет проблем с кодом со времени моей последней проблемы с ковариацией интерфейса.Сегодня я принял другой подход к архитектуре OLGAtherer, и я нашел огромное (для меня) препятствие.Я надеюсь, что это огромный только для меня, и я найду ответ здесь :) Хорошо, пожалуйста, проверьте это:
У меня есть абстрактный универсальный класс:
abstract class Repository<T> where T : Entity
этот класс содержит подписи четырехМетоды CRUD (добавить, вставить и т. Д.) И два защищенных поля.Любой репозиторий, который я создам, должен наследоваться от этого суперкласса.У меня есть репозитории, например:
class BookRepository : Repository<Book>
Теперь у меня есть класс DB, который отвечает за операции над файлом DB.И есть моя проблема.Посмотрите на этот метод, помещенный в класс БД:
void Add(List<Entity> enitites, Type entityType)
{
Repository<entityType> repo = EntitiesFactory(entityType);
repo.Add(entities);
}
Я знаю, что вышеописанный метод не будет работать, но это визуализирует мою проблему (надеюсь) - я хотел бы динамически создать хранилище указанного типа, ноЯ понятия не имею, как это сделать.Это всегда было моей основной проблемой ООП - я мог кодировать наследование (или реализацию интерфейсов), но я не мог использовать эти унаследованные классы.Пожалуйста, объясните мне это.Заранее спасибо.
Paweł
Я использовал подсказки, которые вы предоставили, и вот что у меня сейчас:
public void Add<T>(List<T> entities, string repoName) where T : Entity
{
Repository<T> repo = RepoFactory<T>(repoName, typeof(T));
repo.Add(entities);
}
private Repository<T> RepoFactory<T>(string repoName, Type t) where T : Entity
{
if (t == typeof(Book))
{
Repository<T> repo = (Repository<T>)((object)(new BookRepository(this.ConnectionString, repoName)));
}
return null;
}
RepoFactory теперь находится в классе БД (который, кстати, здесь является своего рода мостом) - его, вероятно, следует перенести в другое место, но здесь это не главная проблема.
Во-первых, я не знаю, правильно ли реализовано тело RepoFactory - наверное, нет.
Второе - я предполагаю, что буду вызывать методы БД из другого класса (скажем - WindowsForm, для простоты).Я буду называть Add с параметром T, зависящим от выбора пользователя.В этой ситуации у меня проблема и я ее временно исправляю, потому что теперь с БД все в порядке, но если мне придется реализовать код WindowsForm, я столкнусь с этим в другой раз (я думаю) - в будущем я постараюсь выяснить ответ на этот вопрос.тот же вопрос, но на более высоком уровне (выше БД) - я надеюсь, вы понимаете меня ... Я имею в виду, что я не буду знать, как динамически вызывать метод Add, потому что T будет зависеть от выбора пользователя (OLGAtherer долженбыть менеджером репозитория, который будет поддерживать Книги и другие виды коллекций).И если пользователь попытается работать со своей коллекцией книг, мне придется вызвать метод Add ().Если с коллекцией комиксов, добавить ().Я не хочу писать урок выше для каждого вида коллекций, но вместо этого используйте один вызов Add для этого.
Если вы понимаете, что я имею в виду, вы действительно хороши :) Мой английский отстой,но я работаю над этим.Спасибо за предыдущие ответы и заранее спасибо за дальнейшие.Paweł