【问题标题】:Using Derived-Class Instance Inside Base-Class to Call Base-Class Method with Derived-class Data在基类中使用派生类实例调用派生类数据的基类方法
【发布时间】:2019-07-25 10:28:04
【问题描述】:

我有一个基本通用组件,我想从基类调用派生方法,该方法返回属于派生类的数据。

第一个问题是,我不能在抽象类中将其定义为静态的!

第二个问题是,当我在基类泛型类中使用 {} 作为 TDomain 创建派生类的新实例时,它的空和方法返回 null ref 错误!

基础实体是这样的:

export abstract class BaseEntity
{
   abstract getColumns():string[];
}

我的模型是这样的:

export class Person extends BaseEntity 
{
    getColumns() {
    return ["Id", "Name"];
  }
}

我有一个通用的基础组件:

@Component({
  selector: 'base-component',
  templateUrl: './base.component.html',
  styleUrls: ['./base.component.css']
})
export class BaseComponent<TDomain  extends BaseEntity,TService extends DataService > implements OnInit {
data:any[];

  constructor() {
  }

  ExportToExcel(): void {
    //must create an instance of derived class
    //then call getcolumns method of it
     let obj = {} as TDomain; // but its empty  doesnt work
    ExcelService.export(obj.getcolumns(this.data));

  }
    }

和派生组件:

@Component({
  selector: 'Derived-Cmp',
  templateUrl: './derived.component.html',
  styleUrls: ['./derived.component.css']
})
export class DerivedComponent extends  BaseCrudComponent<Person,PersonService> implements OnInit {

  //ExportToExcel Method called form html 

}

【问题讨论】:

    标签: angular typescript generic-programming


    【解决方案1】:

    要创建 TDomain 的实例,您需要将 TDomain 的构造函数传递给基类:

    export abstract class BaseEntity {
        abstract getColumns(): string[];
    }
    
    export class Person extends BaseEntity {
        getColumns() { return ["Id", "Name"]; }
    }
    export class BaseComponent<TDomain extends BaseEntity> {
        data: any[];
    
        constructor(public ctor: new () => TDomain) {
        }
    
        ExportToExcel(): void {
            let obj = new this.ctor(); // create instance using the constructor
            obj.getColumns(); /// call method
        }
    }
    
    export class DerivedComponent extends BaseComponent<Person> {
        constructor() {
            super(Person)
        }
    }
    

    链接形式github存储库call derived class method inside base generic class

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 2014-09-05
      • 2016-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      相关资源
      最近更新 更多