Ich versuche Angular2 zu lernen, habe aber ein bisschen Ärger. Ich habe eine abstrakte Service-Klasse ParentService
Vererbung und Polymorphie mit Service und Providern
export abstract class ParentService {
}
und eine andere Service-Klasse aufgerufen, die ParentService
ChildService
export class ChildService extends ParentService {
}
Dann eine Komponentenklasse Ich habe input.component
import { Component } from "@angular/core";
import { ParentService } from "./service/parent.service";
@Component({
selector: 'app-input',
templateUrl: './input.component.html'
})
export class InputComponent {
constructor(private parentService: ParentService) {}
}
genannt genannt erstreckt Und in meinem app.component
Ich stelle eine Instanz des ChildService
import { Component } from '@angular/core';
import { ChildService } from './service/child.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
providers: [ChildService]
})
export class AppComponent {
}
Dies funktioniert jedoch nicht. Es baut in Ordnung, aber wenn die App läuft Ich erhalte eine Fehler:
EXCEPTION: Error in ./AppComponent class AppComponent - inline template:4:16 caused by: No provider for ParentService!
Ist das möglich zu tun? Ich will nur die input.component
eine ParentService
kennen. Ich möchte nicht, dass es die Implementierung kennt.
Sie sollten dieses Muster vermeiden –
@AluanHaddad können Sie erläutern, warum es schlecht wäre? – eric
Vererbung sollte in jeder Sprache und besonders in JavaScript minimal gehalten werden. Da JavaScript keine Schnittstellen hat und TypeScript-Schnittstellen strukturell sind, sehe ich viele Leute, die versuchen, Klassen als Schnittstellen zu verwenden. Das ist eine schreckliche Übung. Sie sollten auf Schnittstellen und nicht auf Implementierungen programmieren. Dies gilt auch für Sprachen, denen manifeste Schnittstellen fehlen. –