假设我们有以下代码:
[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.
}
}
请参阅我要解决的问题(3)的Issue #x.
评论。
到目前为止,我一直在玩一些配置,但我还没有完全掌握它。
您能否帮我理解如何在三个地方访问此方法?
感谢。
答案 0 :(得分:42)
下面有一些代码,但要记住一些重要的概念。
任何实例上都不存在静态方法。这有很好的理由:
new
实例因此,在您调用静态方法的所有情况下,您都需要使用全名:
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());
}
}
答案 1 :(得分:3)
this
与实例相关,而static
成员独立于任何实例。因此,如果要访问静态成员中的实例成员,则必须将其传入。但是在这种情况下,我没有看到首先拥有静态成员的原因。我相信你需要两个功能。一个静态和一个非静态。那做了两件事,所以:
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.
}
}
那就是说你可以使用静态属性在静态和成员函数之间共享属性。
答案 2 :(得分:-20)
不要使用像Class.staticMethod()这样的类名,请使用:
this.constructor.staticMethod()
维护静态方法的继承