Я работаю с API, который предоставляет универсальный класс-обертку, и другим универсальным классом, который ожидает классы с интерфейсом, реализованным оберткой.Теперь у моего проекта также есть универсальная оболочка, которая наследуется от API, и ограничивает свой универсальный параметр базовым классом, используемым моей структурой данных, потому что были общие члены и т. Д. Аналогично у меня также есть свой собственный универсальный класс верхнего уровня, который наследуется отуниверсальный класс верхнего уровня API.Извините за запутанное описание, см. Предоставленный код.
Вопрос: с решением, которое я мог бы найти, мне нужно указывать 2 универсальных параметра каждый раз, когда я реализую свой универсальный универсальный класс верхнего уровня.Хотя второй должен быть первым от первого.Как я могу, или если я не могу, почему я не могу записать это, где мне нужно только указать универсальный параметр верхнего уровня в классах, наследуемых от абстрактного класса верхнего уровня?
Предоставленный кодрешение, которое я мог бы придумать, которое работает само по себе, но кажется ужасной практикой.
// Внешняя структура API:
public abstract class Parameter<T> where T : IDataType
{
// various members to deal with parameter related functions
public virtual T Data { get; set; }
}
public abstract class DataType<T> : IDataType
{
// various members to deal with data type related functions
public virtual T Value { get; set; }
}
public interface IDataType
{
}
// Структура моего проекта:
public abstract class ProjectSpecificParameter<T, Q> : Parameter<T>
where T : ProjectSpecificDataType<Q>
where Q : ProjectSpecificClass
{
public ProjectSpecificClass GetData() // example method which is common in all my project specific parameters.
{
return Data.Value;
}
}
public abstract class ProjectSpecificDataType<T> : DataType<T> where T : ProjectSpecificClass
{
}
public abstract class ProjectSpecificClass
{
}
// как теперь выглядит код:
public class ChairParameter : ProjectSpecificParameter<ChairData, Chair>
{
}
public class ChairData : ProjectSpecificDataType<Chair>
{
}
public class Chair : ProjectSpecificClass
{
// chair specific stuff...
}
// как бы я хотел, чтобы он выглядел:
public class ChairParameter : ProjectSpecificParameter<ChairData>
{
}
public class ChairData : ProjectSpecificDataType<Chair>
{
}
public class Chair : ProjectSpecificClass
{
// chair specific stuff...
}