Задать вопрос
@KislyFan
инженер, связист и просто любитель выпить

Наследование дженериков, как сделать правильно?

Я постарался сделать достаточно простой пример: lдва класса Foo и Boo "зависят" друг от друга.

public class Foo<T, U> where T : Boo<U, T> where U : Foo<T, U>
    {
        protected readonly T _some;
        public Foo(T some)
        {
            _some = some;
        }
    }

    public class Boo<T, U> where T : Foo<U, T> where U : Boo<T, U>
    {
        protected readonly T _some;
        public Boo(T some)
        {
            _some = some;
        }
    }


у каждого из классов есть классы-наследники

public class Too : Foo<Roo, Too>
    {
        public Too(Roo a) : base(a)
        {

        }
    }

    public class Roo : Boo<Too, Roo>
    {
        public Roo(Too b) : base(b)
        {
        }
    }


Есть ли синтаксическая возможность не указывать себя же в родителе public class Roo : Boo< Too, Roo > ?

Дошел до этой дичи сам, изучая дженерик типы. Насколько данная конструкция вообще приемлима и жизнеспособна ? Какие существуют практики ?
  • Вопрос задан
  • 496 просмотров
Подписаться 3 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 2
Это даже читать сложно, путаешься кто от кого зависит.
Ни разу подобного не видел, особенно в проде, и надеюсь не увижу :)

По дженерикам есть бесплатный доклад от Джефри Рехтера - https://youtu.be/H9mP0Ad3TtA?t=4666
День 1, Зал 1, доклад 1.
Он расскажет как они появились и зачем.

В целом дженерик удобен для задания шаблонов, и избежания "упаковок".
Ответ написан
Есть ли синтаксическая возможность не указывать себя же в родителеpublic class Roo : Boo< Too, Roo >?

Нет.
Дошел до этой дичи сам, изучая дженерик типы. Насколько данная конструкция вообще приемлима и жизнеспособна ? Какие существуют практики ?

Иногда такое используют.
Есть ещё один интересный подход - называется Fluent generics
Выглядит это как-то так:
public class List : BaseAsyncEndpoint
    .WithRequest<AuthorListRequest>
    .WithResponse<IList<AuthorListResult>>
{
// ...
}

Вот видео об этом: https://www.youtube.com/watch?v=hKiuj0huEI4&ab_cha...

Не слушайте MrDywar Pichugin
В целом дженерик удобен для задания шаблонов, и избежания "упаковок".

Женерики также можно использовать и для создания хитрых, строго-типизированных DSL, как например в FluentMigrator

Самое главное - не впихивайте женерики там, где можно было бы обойтись без них, и не делайте глубокие рекурсивные женерики, тк от них может компилятор умереть
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы