Приведение, обобщения и подтипы

Пытаясь реализовать шаблон репозитория, я столкнулся с незначительной проблемой, которая, как мне кажется, на самом деле противоречит более серьезным проблемам.

У меня есть DatabaseEntity , которую я m, используя для обработки всех основных операций CRUD, от которых будут происходить все остальные классы, которые необходимо сохранить в базе данных. Он отлично работает для классов, которые наследуются напрямую от него, однако при использовании его с классами, у которых есть промежуточный родительский элемент, я столкнулся с проблемой.

Предположим, у меня есть еще три класса: Parent, ChildA и ChildB и наследование. выглядит так:

DatabaseEntity
|
Родитель
| |
ChildA ChildB

Также предположим, что DatabaseEntity имеет метод со следующей подписью:

public static T FindBy(int id)  

У меня проблема, когда я пытаюсь сделать что-то вроде:

ChildA Foo = ChildA.FindBy(SomeID);

Я получаю ошибку компилятора сообщая мне, что нет неявного преобразования от Parent к ChildA. Это потому, что Parent - это класс, который передается в качестве параметра типа в DatabaseEntity как для ChildA, так и для ChildB. Я думаю, это простое исправление, просто добавьте параметр типа в Parent, передав соответствующий тип. Подождите секунду, тогда мне придется явно определять подтип каждый раз, когда я использую Parent, что разрушает любой полиморфизм. Нет, если подумать, может быть, это не самое лучшее решение.

Я думаю, что я мог бы просто отбросить параметр типа в самом классе DatabaseEntity и сделать так, чтобы каждый метод требовал параметра типа, но тогда мне пришлось бы сделать что-то вроде:

ChildA Foo = ChildA.FindBy<ChildA>(SomeID);

Пока это компилируется, он кажется менее чистым и определенно требует большего набора текста. Visual Studio спрашивает, не хватает ли мне приведения, и хотя это правда, я могу просто привести свой первый пример, это лишь вопрос времени, прежде чем я случайно напечатаю:

ChildB Foo = (ChildB) ChildA.FindBy(SomeID)

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

5
задан Trajanus 17 February 2011 в 02:52
поделиться