Обобщения и наследование
От: Аноним  
Дата: 17.08.11 22:16
Оценка:
Здравствуйте, коллеги!
Суть проблемы в следующем. Пишется библиотека (MyLib), где имеются следующие классы (в порядке наследования):
namespace MyLib
{
    // базовый обощённый класс, который наследует фукциональность от BizObjectT
    public abstract class BizEntityBaseT<T> : BizObjectT<T> // для BizObjectT<T> ограничения where не задана
        where T : BizEntityBaseT<T>
    {
        //
        // некоторые базовые поля и методы для BizEntityBaseT<T>
        //
    }

    // другой обобщённый класс, для Entity с произвольным ID
    public abstract class BizEntityIDBaseTI<TEntity, TID> : BizEntityBaseT<TEntity>
        where TEntity   : BizEntityIDBaseTI<TEntity,TID>
        where TID       : struct
    {
        public abstract TID ID { get; set; }
        //
        // некоторые базовые поля, но уже для BizEntityIDBaseTI<T,I>
        //
    }

    // базовый обощённый класс-список
    public class BizEntitiesListBaseT<T> : BizObjectList<T> // для BizObjectList<T> ограничения where не задана
    {
        //
        // некоторые базовые поля и функциональность, напрямую зависящая от T
        //
    }

    public class BizEntitiesIDListBaseTI<T,I> : BizEntitiesListBaseT<T>
        where T : BizEntityIDBaseTI<T,I>
        where I : struct
    {
        //
        // некоторые базовые поля и функциональность, напрямую зависящая от T и I
        //
    }
}

В основной программе вводим следующие базовые классы (в порядке наследования):
namespace Program
{
    // на этот класс можно не обращать внимание - здесь он просто как вариант
    public abstract class BizEntityBase : MyLib.BizEntityBaseT<BizEntityBase>
    {
        //
        // некоторые базовые поля и функциональность для Program.BizEntityBase
        //
    }

    public abstract class BizEntityIDBaseTI<T,I> : MyLib.BizEntityIDBaseTI<BizEntityIDBaseTI<T,I>, I>
        where T : BizEntityIDBaseTI<T,I>
        where I : struct
    {
        //
        // некоторая функциональность для Program.BizEntityIDBaseTI<T,I>
        //
    }

    public abstract class BizEntityGuidBaseT<T> : MyLib.BizEntityIDBaseTI<BizEntityGuidBaseT<T>,Guid>, Guid>
        where T : BizEntityGuidBaseT<T>
    {
        //
        // некоторые базовые поля и функциональность (в основном static), напрямую зависящая от T с учётом, того что T - BizEntityGuidBaseT<T>
        //
    }

    // *** вот здесь ошибка компиляции
    public class BizEntitiesIDListBaseTI<T,I> : MyLib.BizEntitiesIDListBaseTI<T,I>
        where T : BizEntityIDBaseTI<T,I>
        where I : struct
    {
        //
        // некоторая функциональность для Program.BizEntityIDBaseTI<T,I>
        //
    }}


Собственно, проблема в ошибке компиляции:

Error 1 The type 'T' cannot be used as type parameter 'T' in the generic type or method 'MyLib.BizEntitiesIDListBaseTI<T,I>'. There is no implicit reference conversion from 'T' to 'MyLib.BizEntityIDBaseTI<T,I>'.


На каждой "итерации" наследования могут быть внесены изменения, хотелось бы чтобы до последнего класса/типа в иерархии можно было бы управлять типом параметров. Как можно победить?
Не копи-пастить же код, да?
обобщения наследование
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.