web-dev-qa-db-ja.com

TypeScript:クラス内の静的メソッドにアクセス(同じまたは別のメソッド)

次のコードがあるとします:

[Test.js file]:
class Test {
    ...
    public static aStaticFunction():void {
          ...

           this.aMemberFunction(); // <- Issue #1.
    }

    private aMemberFunction():void {
          ...

          this.aStaticFunction(); // <- Issue #2.
    }
}

[Another.js file]:
class Another {
    ...

    private anotherMemberFunction():void {
          Test.aStaticFunction(); // <- Issue #3.
    }
}

Issue #x.問題に対するコメント(3)対処したい。

私は今までにいくつかの構成で遊んできましたが、まだすべてを手に入れていません。

つの場所でこのメソッドにアクセスするにはどうすればよいですか?

ありがとう。

46
diosney

以下にいくつかのコードがありますが、心に留めておくべき重要な概念がいくつかあります。

静的メソッドはどのインスタンスにも存在しません。これには十分な理由があります。

  1. newインスタンスを作成する前に呼び出すことができます
  2. インスタンスの外部から呼び出すことができるため、呼び出しがどのインスタンスに関連していたのかわかりません

したがって、静的メソッドを呼び出すすべての場合に、フルネームを使用する必要があります。

_Test.aStaticFunction();
_

静的メソッドがインスタンスメソッドを呼び出す必要がある場合は、そのメソッドを渡す必要があります。これにより、警告音が鳴ります。静的メソッドがインスタンスメソッドに依存する場合、おそらく静的メソッドであってはなりません。

私が意味することを確認するには、この問題について考えてください。

インスタンスの外部からTest.aStaticFunction()を呼び出した場合、100個のインスタンスが作成されたときに、静的関数はどのインスタンスを使用する必要がありますか?伝える方法はありません。メソッドがインスタンスのデータを知る必要がある場合、またはインスタンスのメソッドを呼び出す必要がある場合、ほぼ確実に静的であるべきではありません。

したがって、以下のコードは機能しますが、おそらく実際には必要なものではありません。おそらく必要なのは、staticキーワードを削除し、他のクラスで呼び出すインスタンスがあることを確認することです。

_interface IHasMemberFunction {
    aMemberFunction(): void;
}

class Test {
    public static aStaticFunction(aClass: IHasMemberFunction):void {
           aClass.aMemberFunction();
    }

    private aMemberFunction():void {
          Test.aStaticFunction(this);
    }
}

class Another {
    private anotherMemberFunction():void {
          Test.aStaticFunction(new Test());
    }
}
_
48
Fenton

thisはインスタンスに関連していますが、staticメンバーはインスタンスに依存しません。したがって、静的メンバー内のインスタンスのメンバーにアクセスする場合は、そのメンバーを渡す必要があります。ただし、その場合、そもそも静的メンバーを持つ理由はわかりません。 2つの機能が必要だと思います。 1つは静的で、もう1つは非静的です。それは2つの異なることを行うので、:

class Test {

    public  notaStaticFunction():void {
           this.aMemberFunction(); // <- Issue #1.
    }

    public static aStaticFunction():void {

    }

    private aMemberFunction():void {
          this.notaStaticFunction(); // <- Issue #2.
    }
}

class Another {
    private anotherMemberFunction():void {
          Test.aStaticFunction(); // <- Issue #3.
    }
}

つまり、静的プロパティを使用して、静的関数とメンバー関数の間でプロパティを共有できます。

3
basarat