Использование экземпляра производного класса внутри базового класса для вызова метода базового класса с данными производного класса - PullRequest
0 голосов
/ 04 марта 2019

У меня есть базовый универсальный компонент, и я хочу вызвать производный метод из базового класса, который возвращает данные, принадлежащие производному классу.

Первая проблема заключается в том, что я не могу определить его статическим в абстрактном классе!

Вторая проблема заключается в том, что когда я создаю новый экземпляр производного класса с {} в качестве TDomain внутри базового универсального класса, его пустой и метод возвращают нулевую ошибку 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 

}

1 Ответ

0 голосов
/ 07 апреля 2019

Чтобы создать экземпляр 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 вызов метода производного класса внутри базового универсального класса

...