12

与えられた

class BaseClass{

  count:number=0;

  public someMethod=():void =>{
      this.count++;
  }
}

class ChildClass extends BaseClass{
  public someMethod=():void=>{
     super.someMethod();
     //Do more work here.
  }
}

次のエラー メッセージが表示されます。

「super」キーワードを介してアクセスできるのは、基本クラスのパブリック メソッドのみです。

@Basarat はここでいくつかの情報を提供していますが、これは言語に対する本当のハックのようです。 プロトタイプで関数を定義する typescript 矢印演算子

「これ」の文脈上の使用を維持しながら、これをどのように行うことができますか?

アロー関数を適切に使用していますか、それともコールバックのようなものを宣言する方法としてのみ使用する必要がありますか?

4

4 に答える 4

11

議論のために、あなたを仮定します

  • メソッドがUIイベントまたはコールバック(私の場合はノックアウトクリックイベント)によってトリガーされているため、太い矢印構文を使用しています
  • UI (またはコールバック) 応答コードの冗長性を排除するために継承が必要です。

最小限のハック (エレガントではないにしても) の答えは、関数を 2 つの呼び出しに分割して、2 つの問題に対処することです。

Class A {
    public handleScope = () => {
        return this.handleInheritance();
    }

    public handleInheritance() {
        // do work
    }
}

Class B extends A {
    public handleInheritance() {
         super.handleInheritance() // super works here
         // additional work
    }
}

倍増関数が「醜い」ことを認めたのは私が初めてですが、私が見た他のオプションよりもずっと醜くありません。命名を標準化するために、1 行の「スコープ」関数に、基本関数の名前 (例: myFunction) と「Scoper」(つまりmyFunctionScoper) を付けた名前を付けています。Scoperこれは、継承可能なメソッドの名前を入力し始めると、メソッドがヒント付きオプションとして表示されることが多いため、IDE フレンドリーでもあります。

于 2015-08-23T18:47:03.467 に答える
8

矢印は適切に機能しますか、それともコールバックのようなものを宣言する方法としてのみ使用する必要がありますか?

それらは実際にはコールバックにのみ使用する必要があります。クラス階層が必要な場合は、プロトタイプを使用してください。prototypeメモリも節約できます。

強制修正: 1 つしかなくthis、それが現在のインスタンスです。子クラスで上書きする this.fooと、基本インスタンスthis.fooが失われます。コンストラクターでベース バージョンを保持する

class BaseClass{

  count:number=0;

  public someMethod=():void =>{
      this.count++;
  }
}

class ChildClass extends BaseClass{

  constructor(){      
      super();
      var baseSomeMethod = this.someMethod;
      this.someMethod = ()=>{
          // implement here 
      }
  }

}
于 2014-04-22T13:00:58.937 に答える
1

プロトタイプに関数の実装がなければ、派生クラスが基本クラスの実装を「見つける」方法はありません。this保存するための1つの方法と経由で使用するための別の方法があるように、それを分離できますsuper

class BaseClass {
  count: number = 0;

  someMethodImpl() {
    this.count++;
  }

  public someMethod = this.someMethodImpl;
}

class ChildClass extends BaseClass {
  public someMethod = (): void=> {
    super.someMethodImpl();
    //Do more work here.
  }
}
于 2014-04-22T16:08:44.460 に答える
0

ここでの別のディスカッションから、この質問に対する「回答」を取得したいと思います: https://typescript.codeplex.com/workitem/2491

メモリや処理のオーバーヘッドの点では明らかに効率的ではありませんが、質問には答えます。

class Base {
    x = 0;
    constructor() {
        for (var p in this)
            if (!Object.prototype.hasOwnProperty.call(this, p) && typeof this[p] == 'function') {
                var method = this[p];
                this[p] = () => { method.apply(this, arguments); };
                // (make a prototype method bound to the instance)
            }
    }
}

class A extends Base {
    doSomething(value) { alert("A: " + value + " / x == " + this.x); }
}

class B extends A {
    doSomething(value) { alert("B: " + value + " / x == " + this.x ); super.doSomething(value); }
}

var b = new B();
var callback = b.doSomething;
callback("Cool!");
于 2014-05-07T11:53:23.037 に答える