Композиция против дженериков - PullRequest
0 голосов
/ 06 октября 2018

Предположим, у меня есть абстрактный класс A и три конкретных класса, которые наследуются от него, A1, A2 и A3.Существует также другое дерево иерархии с абстрактным классом B и тремя конкретными классами B1, B2 и B3.Каждый конкретный класс A должен содержать список объектов соответственно класса B.Это означает, что A1 содержит список B1.Что было бы лучшим решением:

  1. Сделать A универсальным классом и сделать так, чтобы он содержал общий список T, расширяющий B, например:

    abstract class A<T extends B> {
        protected arr: Array<T extends B>
    }
    

    ThisКстати, я должен объявить каждый класс A следующим образом:

       class A1 extends A<B1>
    
  2. Использовать композицию следующим образом:

    class A1 extends A {
        private arr: Array<B1>
    }
    

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

Я бы предпочел дженерики, если у меня много одинакового кода в разных классах.Так что, если ваши классы A1, A2, A3 схожи по функциональности и просто отличаются по type of B object, тогда переходите на дженерики.Кроме этого, у меня нет веских причин использовать дженерики.Если указанная выше причина не работает, нажмите composition.

0 голосов
/ 06 октября 2018

Это одно и то же, каждый результат идентичен ... как вы знаете.Но только 1-й тип не зависит от типа.По этой причине 1 более полезен для длительного использования.

0 голосов
/ 06 октября 2018

Я предпочитаю второй!Универсальные классы используются, когда у вас есть несколько методов и функций, которые должны применяться к объектам независимо от их типа.в противном случае не стоит объявлять класс универсальным только для решения проблемы композиции!

...