При использовании Интерфейсов вызывает повторение, но использование абстрактного класса вызывает посторонние атрибуты - PullRequest
1 голос
/ 05 марта 2020

У меня в настоящее время есть абстрактный класс MyList.

abstract class MyList<T> {
    public allItems: Array<Array<T>> = []
    public currentPageItems: Array<T> = []
    public currentPage: 

    private setupPagination(data: Array<T>) {
        //implementation
    }

    private resetPagination() {
        //implementation
    }

    private delete(id: number) {
        //implementation
    }

    //more functions and other abstract functions
}

MyList, который поддерживает разбиение на страницы, фильтрацию поиска, удаление и все шло хорошо, пока я не понял, что мне нужен класс, который требует все из MyList, за исключением delete(id: number) (давайте назовем этот класс ListX).

Я знаю, что мог бы использовать композицию интерфейса, повторно внедрив MyList в качестве нескольких интерфейсов (композиция Favor over наследование), но все другие классы, которые наследуют MyList, кроме ListX, имеют идентичную реализацию , Превратив его в интерфейсы, мне нужно было бы повторно реализовать идентичные методы во всех других наследуемых классах, что против DRY (не повторяйте себя).

Я часто сталкиваюсь с тенденцией к тому, чтобы люди говорили «предпочитают композицию, а не наследование» и использовали интерфейсы, но что бы вы сделали, если у вас есть похожие классы, которые имеют действительно идентичные реализации? Было бы разумнее просто обобщить их как абстрактный класс, потому что интерфейсы заставят вас повторить себя. Но опять же, что произойдет, когда вы обнаружите случай, когда классу нужна только часть указанного абстрактного класса?

...