Comunidad de diseño web y desarrollo en internet online

extender la clase Math

Citar            
MensajeEscrito el 02 Feb 2006 02:46 am
Hola gente

Estoy trantando de extender la clase math y estoy con algunos problemitas...

Este es el codigo q uso

Código :

class miMath extends Math {
   public function miMath() {
   }
   static function p() {
      if (40 == abs(40)) {
         return true;
      } else {
         return false;
      }
   }
   static function p2() {
      return abs(40);
   }
   static function opuesto(num):Number {
      if (isNaN(num)) {
         return null;
      } else {
         return Number(num)*-1;
      }
   }
}


y luego la utilizo asi

Código :

import miMath

trace(miMath.opuesto(2))
trace(miMath.p())
trace(miMath.p2(40))
trace(miMath.abs(40))



y me da el siguiente resultado

Código :

-2
true
40
undefined



Lo q me resulta raro es q al utilizar el metodo abs() desde dentro de mi clase si funciona, pero cuando la utilizo desde la instancia no la reconoce.... no es q al extender una clase se heredan todas sus propiedades y metodos? y por lo tanto se podrian utilizarlas en las instancias? o me equivoco? nose... a algo le estoy pifiando y no me estoy dando cuenta de que es lo que es....


Si alguien me hecha un mano estaria muy agracecido :wink:


Saludos!

Por alfathenus

833 de clabLevel

5 tutoriales

 

buenos aires || Argentina

firefox
Citar            
MensajeEscrito el 02 Feb 2006 03:15 am
Extender una clase normal sí, pero extender a la clase Math es un error de lógica más que todo, te explico la clase Math no es una clase cualquiera, es una clase abstracta por lo que no se pueden crear objetos a partir de ella, si ves el código de la clase Math solo tiene propiedades clase (propiedades con el atributo static) y sus metodos no estan implementados dentro de la clase, todos los metodos de la clase Math esta implementados dentro del player y no estan disponibles para el compilador de flash, asi que casi nunca deberias justificar la herencia a la clase Math, por no decir nunca, en verdad es un error de lógica(de conceptos de POO) heredarla.

saludos ^^

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 02 Feb 2006 06:20 am
Hola

Gracias por contestar tan rapido.

Eso que me comentas no lo sabia.... y en la documentacion de flash mx 2004 no lo dice :twisted: . Estuve leyendo la documentacion de flash 8 y buscando por internet y llege a las siguientes concluciones

textual de la ayuda de flash 8 en castellano escribió:

No puede ampliar la clase TextField ni clases estáticas, como las clases Math, Key y Mouse.


Por lo tanto podre extender la clase para crear una clase aparte, q internamente pueda utilizar los miembros de Math, pero nunca esta nueva clase incorporara a los miembros de Math, o sea... nunca voy a poder acer miMath.PI, a menos q implemente la constante PI en miMath porque nunca la va a heredar de Math.


Maikel escribió:

todos los metodos de la clase Math esta implementados dentro del player y no estan disponibles para el compilador de flash


Tenes toda la razon... es mas, todas las clases de as estan implementadas dentro del flash player.

Por otro lado, segun lei por ahi, solo las clases con el modificador "dinamic" antes de class se pueden ampliar, las que tiene el modificador "intrinsic" como la clase Math no pueden ser ampliadas. Aunq no lo entiendo muy bien esto, ya q segun la ayuda de F8, lo q hace ese modificador es que al compilar el flash verifique los tipos de datos q se envian a las funciones/metodos para ver si coinciden con los declarados en los parametros de los metodos y si no coinciden tira error

Por otro lado, por lo q vi y pude probar los atributos y los metodos "static" nose heredan... por eso tb es q no va funcionar como se puede llegar a pensar al utilizar el extends,


Maikel escribió:

es una clase abstracta por lo que no se pueden crear objetos a partir de ella.....sus metodos no estan implementados dentro de la clase....asi que casi nunca deberias justificar la herencia a la clase Math

Dentro de mi humilde conocimiento de OOP llego a entender que AS no tiene clases abstractas y ademas las clases abstractas de otros lenguajes justamente estan hechas para q sus clases "hijas" hereden los miembros abstractos y los implementen (obligatoriamente), algo q no pude ver q suceda con el static en flash... pero q se yo... puede q me equivoque....


saludos y gracias nuevamente ^^

Por alfathenus

833 de clabLevel

5 tutoriales

 

buenos aires || Argentina

firefox
Citar            
MensajeEscrito el 02 Feb 2006 07:24 am
Por otro lado, segun lei por ahi, solo las clases con el modificador "dinamic" antes de class se pueden ampliar,


primero es dynamic, y cuando dicen que se pueden ampliar no se refieren justamente a la herencia, se refieren a que puedes agregarle metodos y/o propiedades durante la codificacion, un buen ejemplo es el tipico uso de LoadVars.

Código :

var miLoadVars:LoadVars = new LoadVars();
miLoadVars.nombre= "Maikel";
trace(miLoadVars.nombre);


alli le estoy agregando una propiedad al objeto miLoadVars ;)

Por otro lado, por lo q vi y pude probar los atributos y los metodos "static" nose heredan... por eso tb es q no va funcionar como se puede llegar a pensar al utilizar el extends,


Los static no se heredan, porque son propiedades clase o metodos clases, los que se heredan son las propiedades de instancias o metodos de instancia, simplemente lo que no tengan ese atributo, las propiedades clase y metodos clase son accedidos directamente por el nombre de la clase, nunca por el nombre de la instancia (objeto). ejemplo:

Código :

Math.floor(3.24);


Dentro de mi humilde conocimiento de OOP llego a entender que AS no tiene clases abstractas y ademas las clases abstractas de otros lenguajes justamente estan hechas para q sus clases "hijas" hereden los miembros abstractos y los implementen (obligatoriamente), algo q no pude ver q suceda con el static en flash... pero q se yo... puede q me equivoque....


no, eso son interfaces, claramente en actionscript se definen con interface :wink: , una clase abstracta sencillamente es la que solo contienen propiedades clase y metodos clase, y no pueden crearse objetos a partir de ella.

las que tiene el modificador "intrinsic" como la clase Math no pueden ser ampliadas


Intrinsic simplemente significa que la implementacion de la clase no esta disponible para el compilador de flash, pues estan implementadas dentro del player.

Bueno, dejame recomendarte el libro de Essential ActionScript 2.0 de Colin Moock, es muy bueno y explica todo esto y muchisimo mas :P

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 02 Feb 2006 04:38 pm
seeee, me entere que habia salido en español la semana despues de haberlo pedido :roll: , flash remoting sorry no :oops: , no he comprado ninguno de remoting, pero el que te recomende si que es muy bueno, aun lo estoy leyendo :P , cualquier libro de Colin Moock que veas lo puedes comprar sencillamente es un Maestro.


saludos ^^

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 03 Feb 2006 12:52 am
Todo tiene solución en base a la lógica que se aplique. Si bien es cierto que no tiene sentido extender una clase estatica, si podemos contruir una dinámica, que emule todos los metodos de otra u otras. Esto para distribuir un objeto en nuestro grupo de desarrollo, o cuaquier otra necesidad que se tenga:

Código :

dynamic class miMath{
   static function  __resolve( name )
   {
       return Math[name];
   }
   static function p() {
      if (40 == Math.abs(40)) {
         return true;
      } else {
         return false;
      }
   }
   static function p2() {
      return Math.abs(40);
   }
   static function opuesto(num):Number {
      if (isNaN(num)) {
         return null;
      } else {
         return Number(num)*-1;
      }
   }
}



Ahora esto si funciona:

Código :


import miMath;

trace(miMath.opuesto(2))
trace(miMath.p())
trace(miMath.p2(40))
trace(miMath.abs(40))


Saludos :wink:

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 03 Feb 2006 04:42 pm
__resolve es una propiedad de los objetos en Flash, Lo que hace loco, es cachar las llamadas a propiedades y métodos no existente de la clase(solo funciona en clases dinámicas). Esto no esta documentado como tal, pero siguiendo la lógica de que todas las clases son objetos, y que todos los objetos tienen la propiedad __resolve, lo mas lógico era que funcionara, y efectivamente así es.

:wink:

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 04 Feb 2006 03:59 am
Hola

Muchas gracias por la explicacion :wink:


Yo la he utilzado de la siguiente forma

Código :

class miMath extends Math{
.....
}


Como veras no utilice una clase dinamica y lo del __resolve me funciono de maravillas :D


ahh, en el livedocs de macromedia (no me fije en el help del flash) esta documentada esa propiedad :P nose si a eso te referias....

Saludos!

Por alfathenus

833 de clabLevel

5 tutoriales

 

buenos aires || Argentina

firefox
Citar            
MensajeEscrito el 04 Feb 2006 09:19 am
Hola,

En efecto __resolve SI esta documentado. Pero en la documentación y tal, lo mencionan exclusivo de los objetos. Y lo definen únicamente así:

Código :

miObjeto = new Object();
miObjeto.__resolve


Era solo eso. Y lo de la clase dinámica, es por que generalmente cuando uso __resolve es por que crearé metodos onTheFly, por eso necesito la clase dinámica. :wink:

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 05 Feb 2006 10:26 pm
Hola

si es verdad, lo mensionan como una propiedad de los objetos genericos... ^^


Saludos!

Por alfathenus

833 de clabLevel

5 tutoriales

 

buenos aires || Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.