类基于实例扩展另一个类

问题描述 投票:0回答:1

我正在寻找以下解决方案:

class BasicTable {
  addData() {
    console.log("******** BasicTable");
  }
}

class BasicHtmlTable extends BasicTable {
  override addData() {
    console.log("--------- BasicHtmlTable");
  }
}

class Table<T extends BasicTable | BasicHtmlTable> extends BasicTable {
  printData() {
    console.log("--------- Table");
    super.addData();
  }
}

class A extends Table<BasicTable> {
  test() {
    this.printData();
  }
}

class B extends Table<BasicHtmlTable> {
  test() {
    this.printData();
  }
}

const aInstance = new A();
const bInstance = new B();

aInstance.test(); 
bInstance.test();

对于 A 类,我想使用 BasicTable 中的方法。 对于 B 类,我想使用 BasicHtmlTable 中的方法。

但我的实现始终使用 BasicTable 中的方法而不是 BasicHtmlTable。

我需要建议在打字稿中实现这一点。

详细提到了

typescript
1个回答
0
投票

TypeScript 泛型用于在编译时进行类型检查,但不影响运行时行为。

Table
类被定义为扩展
BasicTable
。泛型类型 T 确保 T 只能是 BasicTable 或 BasicHtmlTable (并在复杂化过程中进行验证),但它不会改变
Table
扩展
BasicTable
的事实。

如果您希望

B
扩展
BasicHtmlTable
,您可以使用组合而不是继承(请参阅下面的代码示例)。

    constructor(private table: T) {
        super();
    }

    printData() {
        console.log("--------- Table");
        this.table.addData();
    }
}

class A extends Table<BasicTable> {
    constructor() {
        super(new BasicTable());
    }

    test() {
        this.printData();
    }
}

class B extends Table<BasicHtmlTable> {
    constructor() {
        super(new BasicHtmlTable());
    }

    test() {
        this.printData();
    }
}

(使用其他设计也可能得到类似的结果,但组合是一个众所周知的概念)

© www.soinside.com 2019 - 2024. All rights reserved.