Доступ к универсальному параметру параметра, который является универсальным классом, без указания двух универсальных параметров на верхнем уровне? - PullRequest
0 голосов
/ 03 апреля 2019

Я работаю с 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...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...