2016-05-17 31 views
2

私はストア関係関数を定義する親クラスと、ストア上にそのテーブルを定義する子クラスを持っています。親クラスでは、インスタンスのテーブルに接続するsave()関数を定義していますが、そのテーブルはその子に定義されています。子のtableNameを受け入れるように親のコンストラクタを設定することができたと思っていましたが、thisを参照する前にsuperを呼び出さなければならないという不満がありました(thisの属性をsuperに渡したい場合でも)。親クラスから子クラスの属性にアクセスできますか?

export class StoredObject { 
    constructor(private tableName: string) {} 

    public save() { 
     store.collection(this.tableName) //... 
    } 
} 

と子:

はここに親の私は一つの解決策は、単にthis.tableNameの値を返すgetter関数を作ることです知っている

export class Inventory extends StoredObject { 
    tableName = "inventory"; 

    constructor(
     public myVar //... 
    ) { 
     super(this.tableName) 
    } 
} 

、それはハックようです。私はまた、実際に文字列をsuperに入れてもよいことを知っています(例えば、Inventoryにはコンストラクタを{ super("inventory") }としていますが、それは魅力的ではありません)。私はそれを見つけることができないよう

+0

あなたのコードに誤りがあると思います。あなたは変数としてtableNameを決して定義しないので、グローバルスコープにあると信じています。さらにthis.tableNameはスコープに格納されているprivate変数tableNameを参照しません(varを前に置いた場合)。アクセス可能な試してthis.tableName = "目録"。 – Blue

答えて

4

Ryan Cavanaugh's response here

を見てみましょう具体的には、初期設定の

順序は次のとおりです。

  1. 基底クラス初期化プロパティは
  2. を初期化され、基本クラスのコンストラクタは、派生クラス初期化プロパティは、あなたがあなたのスーパークラスが責任を作った

派生クラスのコンストラクタが実行さ

  • 初期化され
  • 走りますtableNameプロパティを初期化するためのもので、サブクラスを作成する前にそれを行うことができる必要があります。あなたは "在庫"を渡すか、この関係を変更する必要があります。

  • 関連する問題