Angular2依赖注入抽象类

Angular2依赖注入抽象类,angular,dependency-injection,abstract-class,Angular,Dependency Injection,Abstract Class,我在互联网上查找一个随机角度问题的解决方案,遇到了以下示例: export class AppModule { constructor(private router: Router, private viewportScroller: ViewportScroller) { this.router.events.pipe( filter((e: Event): e is Scroll => e instanceof Scroll), pairwise()

我在互联网上查找一个随机角度问题的解决方案,遇到了以下示例:

export class AppModule {
  constructor(private router: Router, private viewportScroller: ViewportScroller) {
    this.router.events.pipe(
      filter((e: Event): e is Scroll => e instanceof Scroll),
      pairwise()
    ).subscribe((e: Scroll[]) => {
      const previous = e[0];
      const current = e[1];
      if (current.position) {
        this.viewportScroller.scrollToPosition(current.position);
      } else if (current.anchor) {
        this.viewportScroller.scrollToAnchor(current.anchor);
      } else ...
   ...

ViewportScroller是一个抽象类。我试图理解Angular中的依赖注入。如何使抽象类可注入?

将注入的是扩展ViewportScroller的实际类。Interfacets也可以用作注入口。将被注入的是由某些提供者提供的给定接口的实现

您可以注入一个具有具体实现的抽象类

以下是如何在Angular中定义ViewportScroller:

然后,它由BrowserViewportScroller实现:

/**
 * Defines a scroll position manager. Implemented by `BrowserViewportScroller`.
 */
export abstract class ViewportScroller {
  // De-sugared tree-shakable injection
  // See #23917
  /** @nocollapse */
  static ɵprov = ɵɵdefineInjectable({
    token: ViewportScroller,
    providedIn: 'root',
    factory: () => new BrowserViewportScroller(ɵɵinject(DOCUMENT), window)
  });

...
/**
 * Manages the scroll position for a browser window.
 */
export class BrowserViewportScroller implements ViewportScroller {
  private offset: () => [number, number] = () => [0, 0];

  constructor(private document: Document, private window: Window) {}

...