Javascript 使用接口会导致重复,但使用抽象类会导致无关属性

Javascript 使用接口会导致重复,但使用抽象类会导致无关属性,javascript,oop,inheritance,interface,composition,Javascript,Oop,Inheritance,Interface,Composition,我目前有一个抽象类MyList abstract class MyList<T> { public allItems: Array<Array<T>> = [] public currentPageItems: Array<T> = [] public currentPage: private setupPagination(data: Array<T>) { //implementa

我目前有一个抽象类
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{
公共联合项:数组=[]
public currentPageItems:数组=[]
公共网页:
专用设置分页(数据:数组){
//实施
}
私有重置分页(){
//实施
}
私人删除(id:编号){
//实施
}
//更多函数和其他抽象函数
}
MyList
支持分页、搜索过滤、删除,事情一直进展顺利,直到我意识到我需要一个类,该类需要除
delete(id:number)
之外的所有
MyList
方法(我们称这个类为
ListX

我知道我可以通过将
MyList
重新实现为多个接口来使用接口组合(支持组合而不是继承),但是继承
MyList
的所有其他类(除了
ListX
之外)都有相同的实现。通过将其转换为接口,我需要在所有其他继承类中重新实现相同的方法,这是对DRY的反对(不要重复)


我经常遇到这样一种趋势:人们说“更喜欢组合而不是继承”,并使用接口,但是当您拥有具有完全相同实现的类似类时,您会怎么做?将它们概括为一个抽象类会更有意义,因为接口只会让你重复你自己。但是,当您发现一个类只需要所述抽象类的一部分的异常情况时,会发生什么呢?

您遇到了OOP及其层次结构的挑战之一。虽然我没有时间去充实一个答案,但我会告诉你性格和混合的方向。我不确定它们是否是Typescript中的一个特性,但它们确实为您注意到的问题提供了一个解决方案。我想到的一个“解决方案”(不是真的)是抛出一个非法的OperationException,或类似的东西,用于一个不适用delete的特殊情况。您遇到了OOP及其层次结构的挑战之一。虽然我没有时间去充实一个答案,但我会告诉你性格和混合的方向。我不确定它们是否是Typescript中的一个特性,但它们确实为您注意到的问题提供了一个解决方案。我想到的一个“解决方案”(不是真的)是抛出一个非法的OperationException,或者类似的东西,用于delete不适用的特殊情况。