2016-04-07 17 views
2

In meiner Suche von Vererbungs Klasse passieren zu müssen Angular2 zu lernen, ich kam über die folgende Situation:Verwenden Abhängigkeit in Basisklasse ohne diese Abhängigkeit

  • 1 Basisklasse, die die angular2/http Abhängigkeit verwendet
  • 1 inheriting Klasse, welche die Basisklasse

wie kann ich die angular2/HTTP-Abhängigkeit in der Basisklasse Konstruktor injizieren, ohne dass passieren http als Parameter erstreckt, wenn die erbenden Klasse instanziieren.

Ich benutze http nicht in der erbenden Klasse, also will ich es nicht dort sehen!

Zum Beispiel

// base class 
class CRUDService { 

    // http is used in this service, so I need to inject it here 
    constructor(@Inject(Http) http) {} 

    findAll() { 
     return this.http.get('http://some.api.com/api/some-model'); 
    } 
} 

// inheriting class 
class ThingService extends CRUDService { 

    constructor() { 
     // because we extend the base class, we need to call super() 
     // this will fail since it expects http as a parameter 
     // BUT i don't use http in this class, I don't want to inject it here 
     super(); 
    } 
} 

Idealerweise würde ich erstellen Sie einfach eine neue HTTP-Instanz in der Basisklasse und verwenden wie so let http = new Http();, aber das offensichtlich nicht funktioniert.

+0

Sie müssen es in die erbende Klasse injizieren, aber wenn es hilft, können Sie auf es von der Basisklasse zugreifen und so etwas wie tun '( this) .http.get (...)' (Sie brauchen nicht um es explizit über 'super()' zu übergeben. – rinogo

Antwort

1

Das wird nicht unterstützt. Wenn Sie etwas injizieren möchten, müssen Sie es im Konstruktor der Unterklasse auflisten, und wenn Sie es an die Superklasse weitergeben möchten, können Sie super(someDependency) verwenden. Es gibt keinen Weg.
Das ist keine Angular-Einschränkung, sondern eine Sprachbeschränkung, die bei typisierten Klassen recht häufig vorkommt.

+0

Ich versuche, meinen Kopf um diese zu wickeln. Es scheint mir zu diesem Zeitpunkt völlig lächerlich ... :( – Tyguy7

+0

Ich habe das schon oft gehört. Es gibt nichts, das kantig sein kann machen Sie das, wie Konstruktoren in TS (und vielen anderen Sprachen) funktionieren Wenn die Unterklasse überhaupt keinen Konstruktor hat, dann wird der Konstruktor der Oberklasse verwendet, aber wenn die Unterklasse einen Konstruktor hat, alle Parameter müssen wiederholt und an "super()" übergeben werden. –