javascript - herencia - TypeScript: Acceda a métodos estáticos dentro de las clases(iguales u otros)
herencia en angular 2 (4)
Hay algunos códigos a continuación, pero hay algunos conceptos importantes a tener en cuenta.
Un método estático no existe en ninguna instancia. Hay buenas razones para esto:
- Se puede invocar antes de haber creado una
new
instancia - Se puede invocar desde fuera de una instancia, por lo que no sabría a qué instancia estaba relacionada la llamada.
Entonces, en todos los casos en que llame al método estático, debe usar el nombre completo:
Test.aStaticFunction();
Si el método estático necesita llamar a un método de instancia, necesita pasarlo. Sin embargo, esto sí hace sonar las alarmas. Si el método estático depende de un método de instancia, probablemente no sea un método estático.
Para ver lo que quiero decir, piensa en este problema.
Si llamo Test.aStaticFunction()
desde fuera de una instancia, cuando se han creado 100 instancias, ¿qué instancia debe usar la función estática? No hay forma de decirlo. Si su método necesita conocer datos de la instancia o llamar a métodos en la instancia, es casi seguro que no debe ser estático.
Entonces, aunque el código siguiente funciona, probablemente no sea realmente lo que necesita; lo que probablemente necesite es eliminar la palabra clave static
y asegurarse de tener una instancia para llamar a sus otras clases.
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());
}
}
Supongamos que tenemos el siguiente código:
[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.
}
}
Vea el Issue #x.
comentarios para los problemas (3) Quiero abordar.
He estado jugando con algunas configuraciones hasta ahora y aún no lo tengo todo.
¿Me pueden ayudar a comprender cómo puedo acceder a estos métodos en los tres lugares?
Gracias.
this
está relacionado con una instancia mientras que static
miembros static
son independientes de cualquier instancia. Entonces, si desea acceder a los miembros de una instancia dentro de un miembro estático, debe pasarlo. Sin embargo, en ese caso, no veo una razón para tener un miembro estático en primer lugar. Creo que necesitas dos funciones. uno estático y uno no estático. Eso hace dos cosas diferentes, entonces:
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.
}
}
Dicho esto, puede compartir propiedades entre funciones estáticas y miembro utilizando propiedades estáticas.
no use el nombre de clase como Class.staticMethod (), use esto:
this.constructor.staticMethod()
para mantener la herencia de los métodos estáticos
para usar en una función estática:
new this().MemberFunction()
no lo sé, funciona, pero compila