Хорошо, поэтому я просто хочу извиниться за некоторые из плохого кода, который был в моем примере. Но, надеюсь, если вы посмотрите на него какое-то время, вы увидите, где все пошло не так. Но вот ответ, который я придумал. Я думаю, что в конверсии может быть лучший способ, но мне нужно решение, которое не требовало от меня изменения класса BusinessBase, поскольку это основной компонент CSLA, а не тот, который я хочу изменить. Вот код, который я придумал, что работает:
interface A<T>
{
T Save();
}
interface IConcreteInterface : A<IConcreteInterface>
{
}
class BusinessBase<T>
where T : BusinessBase<T>
{
public T Save()
{
return (T)this;
}
}
class D<T, U> : BusinessBase<T>
where T : BusinessBase<T>, A<U>
where U : A<U>
{
public new U Save()
{
return (U)(object)base.Save();
}
}
class ConcreteClass : D<ConcreteClass, IConcreteInterface>, IConcreteInterface
{
}
Изменения, которые сделали его работа заключалась в следующем: возвращение (U) (объект) base.Save();
Прежде, чем я не был помещен в (U), отлитый в образце, потому что он не компилируется таким образом. Поскольку нет связи между T и U, которые могут быть определены. Таким образом, единственный способ обойти это - вернуть возвращаемый T из Save to (object), который, конечно же, будет способен на что-то бросать.
Вы заметили, что я добавил также ограничение типа для небольшой дополнительной защиты от ошибок при бросании, поскольку я уверен, что T имеет тип A и что U имеет тип A. Это гарантирует, что оба типа имеют один и тот же интерфейс.
Если у кого-то есть что-то красивое, я открыт для предложений. Но пока это работает, и я чувствую себя немного хорошо. Вы можете делать то, что я сделал, что, по крайней мере, потребовалось T для реализации. Это не очень красиво, и вы можете принудить немного больше.
нет У меня нет этой книги. Мне нужно будет посмотреть, смогу ли я получить его копию. Но вы правы, между ними нет определенной связи. Хотя есть связь между T BusinessBase и U of B . Поскольку U - это интерфейс, который реализует T. Я надеялся, что с этими отношениями я кое-что увидел. –
spinon