Clases y Objetos
Publicado por cool1007 en Febrero 27, 2007
Diseño Pagina Web
Como en cualquier otra lengua de OOP, en rubí, cada objeto pertenece a cierta clase (por ejemplo, PontiacFirebird pudo ser un objeto del coche de la clase). Como vimos en la discusión al principio de este capítulo, una clase puede agrupar objetos de cierta clase, y equipa esos objetos de funcionalidad común. Esta funcionalidad viene bajo la forma de métodos, y en la capacidad del objeto de almacenar la información. Por ejemplo, un objeto de PontiacFirebird pudo necesitar almacenar su kilometraje, como fuerza cualquier otro objeto del coche de la clase.
En rubí, el instantiation de un nuevo objeto que se base en una clase existente es logrado enviando esa clase el nuevo mensaje. El resultado es un nuevo objeto de esa clase. Los siguientes pocas líneas del código demuestran una definición extremadamente básica de la clase en rubí — la tercera línea es donde creamos un caso de la clase que acabamos de definir.
coche de la clase del irb>
extremo del irb>
nada del =>
kitt del irb> = Car.new
=> #
Otro principio de base en OOP es encapsulación. Según este principio, los objetos se deben tratar como entidades independientes, cada cuidado que toma de sus propios datos internos y funcionalidad. Si necesitamos tener acceso a la información de un objeto — por ejemplo, sus variables internas — hacemos uso el interfaz del objeto, que es el subconjunto de los métodos del objeto que se hacen disponibles para otros objetos para llamar.
El rubí provee de objetos funcionalidad en dos niveles — el nivel del objeto, y nivel de la clase — ¡y adhiere al principio de la encapsulación mientras que está en ella! Cavemos más profundo.
funcionalidad del Objeto-nivel
En el nivel del objeto, el almacenaje de datos es manejado por las variables del caso (un nombre que se deriva del proceso del instantiation mencionado arriba). Pensar en variables del caso como envases de almacenaje a que se unan al objeto, pero a cuáles no tienen otros objetos acceso directa.
Para almacenar o para recuperar datos de estas variables, otro objeto debe llamar un método del accessor en el objeto. Un método del accessor tiene la capacidad de fijar (y conseguir) el valor de las variables del caso del objeto.
Miremos cómo las variables del caso y los métodos del accessor se relacionan el uno al otro, y cómo se ponen en ejecución en rubí.
Citar como ejemplo las variables
Las variables del caso están limitadas a un objeto, y contienen los valores para ese objeto solamente.
Revisitando nuestro ejemplo de los coches, los valores del kilometraje para un número de diversos objetos del coche son probables diferenciar, pues cada coche tendrá un diverso kilometraje. Por lo tanto, el kilometraje se lleva a cabo en una variable del caso.
Una variable del caso se puede reconocer por su prefijo: un solo “en” la muestra (@). ¡Y cuál es más, las variables del caso incluso no necesita ser declarado! Hay solamente un problema: no tenemos ninguna manera de recuperarlos o de cambiar una vez que existan. Aquí es adonde los métodos del caso entran en el juego.
Métodos del caso
El almacenaje y la recuperación de datos no es la única capacidad que se puede limitar a un objeto específico — la funcionalidad, se puede limitar también a los objetos. Alcanzamos este atascamiento con el uso de los métodos del caso, que son específicos a un objeto. La invocación de un método del caso (es decir enviando un mensaje que contiene el nombre del método a un objeto) invocará esa funcionalidad en el objeto de recepción solamente.
Se definen los métodos del caso usando la palabra clave del def, y el extremo con la palabra clave del final. Incorporar el ejemplo siguiente en una nueva cáscara de rubíes:
$ de irb
coche de la clase del irb>
open_trunk del def del irb>
el código de # del irb> para abrir el tronco va aquí
extremo del irb>
extremo del irb>
nada del =>
kitt del irb> = Car.new
=> #
Qué has hecho es define una clase llamada Car, que tiene un método del caso con el open_trunk conocido. Un objeto del coche instantiated de esta clase que la voluntad (que usa posiblemente una cierta robótica de lujo conectada con nuestro programa de rubíes) abre su tronco cuando se llama su método del open_trunk. (No hacer caso de ese valor de la vuelta de nada para el momento; miraremos valores de la nada en la sección siguiente.)
Mellar tu código
Mientras que es la muesca del código un elemento dominante del sintaxis de idiomas tales como Python, en el rubí, muesca es puramente cosmético — ayuda a legibilidad, pero no afecta el código de ninguna manera. De hecho, mientras que estamos experimentando con la cáscara de rubíes, no necesitas ser preocupado también de mellar código un de los. Sin embargo, cuando somos los archivos del ahorro que serán corregidos más adelante, desearás las ventajas de la legibilidad que vienen de mellar líneas jerarquizadas.
La comunidad de rubíes ha convenido en dos espacios como siendo óptima para mellar bloques del código tales como definiciones de la clase o del método. Adheriremos a este esquema de la muesca a través de este libro.
Con nuestra clase en lugar, podemos hacer uso este método:
irb> kitt.open_trunk
nada del =>
Puesto que no quisiéramos que los troncos de todos los coches se abrieran inmediatamente, hemos hecho esta funcionalidad disponible como método del caso.
Sé, yo sé: todavía no hemos modificado ningunos datos. Utilizamos los métodos del accessor para esta tarea.
Métodos del Accessor
Un método del accessor es un tipo especial de método del caso, y se utiliza leer o escribir a una variable del caso. Hay dos tipos: lectores (a veces llamados “compradores”) y escritores (o “setters”).
Un método del lector mirará dentro del objeto, traerá el valor de una variable del caso, y dará este valor de nuevo a nosotros. Un método del escritor, por otra parte, mirará dentro del objeto, encontrará una variable del caso, y asignará a variable el valor que fue pasado.
Agreguemos algunos métodos para conseguir y fijar la cualidad del @mileage de nuestros objetos del coche. De nuevo, salida de la cáscara de rubíes de modo que poder crear enteramente una nueva definición de la clase del coche. Nuestra definición de la clase está consiguiendo un pedacito más largo ahora, así que incorporar cada línea cuidadosamente. Si incurres en una equivocación que mecanografía, salir de la cáscara y comenzar encima.
$ de irb
coche de la clase del irb>
set_mileage del def del irb> (x)
@mileage del irb> = x
extremo del irb>
get_mileage del def del irb>
@mileage del irb>
extremo del irb>
extremo del irb>
nada del =>
kitt del irb> = Car.new
=> #
¡Ahora, podemos finalmente modificar y recuperar el kilometraje de nuestros objetos del coche!
irb> kitt.set_mileage (5667)
=> 5667
irb> kitt.get_mileage
=> 5667
Esto sigue siendo un pedacito torpe. ¿No sería agradable si podríamos dar a nuestro accessor métodos exactamente los mismos nombres que las cualidades a las cuales él lee en o escribe? Afortunadamente, el rubí contiene la notación de la taquigrafía para esta misma tarea. Podemos reescribir nuestra definición de la clase como sigue:
$ de irb
coche de la clase del irb>
mileage=(x) del def del irb>
@mileage del irb> = x
extremo del irb>
kilometraje del def del irb>
@mileage del irb>
extremo del irb>
extremo del irb>
nada del =>
kitt del irb> = Car.new
=> #
Con estos métodos del accessor en lugar, podemos leer a y escribir de nuestra variable del caso como si estuviera disponible fuera del objeto.
irb> kitt.mileage = 6032
=> 6032
irb> kitt.mileage
=> 6032
Estos métodos del accessor forman la parte del interfaz del objeto
Publicado en Uncategorized | No hay comentarios »