2016-02-29 9 views
10

なぜtypescript派生クラスは同じ変数名を持つことができませんか?これらのメンバーでもプライベートです。これに代わる方法があるのですか、何か間違っていますか?typescript派生クラスは同じ変数名を持つことはできませんか?

class ClassTS { 

    private nom: string = "ClaseTS"; 

    constructor() { 

    } 
} 

class ClassTSDer extends ClassTS { 

    private nom: string = "ClassTS"; 

    constructor() { 
     super(); 
    } 
} 

これはTSで練習中に見つかりました。

クラス 'ClassTSDer'は、基本クラス 'ClaseTS'を間違って拡張します。タイプ は、プライベートプロパティ 'nom'の別々の宣言を持っています。 ClassTSDer

クラスClassTSDer

あなたは、使用がを保護することができ、はい、私は保護を使用したくない場合、別の名前を使用する必要がありますか?

+0

ない「ものの、」しかし、民間uは同じ名前を持つカントがあるbecouse。私はプライベートプロパティ(親クラスと同じプロパティを持つ子クラスは常にこれをオーバーライドしたい)をオーバーライドしたい。私は痛み親と子のクラスでパブリックに設定がなかったし、それが動作 – Szymon

+0

「あなたが保護された使用することができます」=>:D – Guntram

答えて

19

プロパティには異なる名前が必要です。

実行時にJavaScriptクラスインスタンスは単なるオブジェクトであり、オブジェクトはキーから値へのマッピングであることに注意してください。プロパティ名はキーであり、同じ名前の2つの異なるキーを持つことはできません。

+2

は答えてくれてありがとう、私は私が何か間違ったことをやったと思いました。またはおそらく、これのための予約語がありました、短くて簡単で非常に有用なあなたの説明のあなたの時間のためのあなたの説明。 –

8

プロパティには異なる名前が必要です。

あなたが生成さES5コードを見てみましょう場合は、私有財産と同じ名前の子クラスのプロパティを宣言すると、親は、このようにカプセル化を壊す親1を上書きしてしまいますことがわかります。子に呼び出され、親からの任意の関数を使用して、私有財産から期待通りの代わりに「ClaseTs」の値が「ClassTS」を有するthis.nomになりますため、この場合には

/** 
* ClassTS 
*/ 
var ClassTS = (function() { 
    function ClassTS() { 
     this.nom = "ClaseTS"; 
    } 
    ClassTS.prototype.someMethod = function() { 
     console.log(this.nom); 
    }; 
    return ClassTS; 
}()); 
/** 
* ClassTSDer 
*/ 
var ClassTSDer = (function (_super) { 
    __extends(ClassTSDer, _super); 
    function ClassTSDer() { 
     _super.call(this); 
     this.nom = "ClassTS"; 
    } 
    ClassTSDer.prototype.childMethod = function() { 
     _super.prototype.someMethod.call(this); 
    }; 
    return ClassTSDer; 
}(ClassTS)); 

カプセル化の期待がもはや存在しないため、コンパイラは(彼らは同じES5コードを生成するにもかかわらず)保護性質文句はありません。

+1

お返事ありがとうございます、私は何かが間違っていると思った。またはおそらくこれのための予約語があった、あなたは言う...コンパイラは保護について不平を言わない...私はあなたの時間のために感謝しなかった –