Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre uno de los temas mas importantes en OOP.

Anuncios

Como mencionamos este es uno de los pilares fundamentales para la programacion orientada a objetos o mas conocida como OOP, pero que es la herencia?

Es la capacidad que posee el lenguaje de poder pasar las propiedades y metodos de una clase madre a sus clases hijas

el tinchicus
Anuncios

En nuestro caso no lo haremos con las clases sino con los trait, su sintaxis es bien simple:

trait nombre : trait_base
{
	... instrucciones ...
}
Anuncios

Es como un trait normal pero tendra los dos puntos (:) seguido del nombre que sera nuestro trait base o padre, vamos a realizar un ejemplo para ver como trabaja.

Anuncios

Para ello vamos a crear un nuevo ejemplo que llamaremos herencia, una vez creado iremos al archivo main.rs y modificaremos el codigo generado por el siguiente:

main.rs

trait Animal
{
	fn caminar(&self);
}

trait Mamifero : Animal
{
	fn hablar(&self);
}

struct Perro;
impl Animal for Perro
{
	fn caminar(&self)
	{
		println!("Perro caminando");
	}
}

impl Mamifero for Perro
{
	fn hablar(&self)
	{
		println!("Perro ladrando");
	}
}

fn main() 
{
	let arturo = Perro {};

	arturo.caminar();
	arturo.hablar();
}
Anuncios
Anuncios

Primero crearemos una clase base llamada Animal y en esta definiremos un prototipo para la accion de caminar, lo siguiente sera otro trait llamado Mamifero que sera «heredera» de Animal, ya veremos el porque de las comillas, dentro de este nuevo trait tenemos otro prototipo para la accion de hablar, lo sguiente sera un struct de tipo Unit-like que identificaremos como Perro, ahora comienza lo bueno.

Anuncios
Anuncios

Lo siguiente sera un impl para implementar el trait de Animal para Perro, en este definiremos al metodo caminar para que muestre un mensaje en pantalla, lo siguiente sera otro impl donde implementaremos el trait de Mamifero para Perro y dentro del bloque definiremos al metodo hablar, por ultimo tenemos el main donde crearemos un objeto del struct Perro y por ultimo llamaremos a los metodos de cada trait, compilemos y veamos su salida:

tinchicus@dbn001vrt:~/lenguajes/rust/herencia$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/herencia`
Perro caminando
Perro ladrando
tinchicus@dbn001vrt:~/lenguajes/rust/herencia$
Anuncios

Como podemos ver funciono correctamente pero este lenguaje no tiene herencia como tal sino que el operador de los dos puntos le dice al lenguaje algo como:

Lo implementado en el trait Mamifero tambien necesita implementar el trait de Animal

El tinchicus
Anuncios

Es decir, para que funcione debemos tener implementado a Animal lo cual no es una herencia como tal sino una obligacion para que se implementen de mejor manera, aunque como vemos en la salida el objeto podra tener acceso a los metodos y propiedades de todos nuestros trait, para verificar esto simplemente quiten el bloque de impl Animal, vuelvan a compilar y veran que nos devuelve un error informando lo comentado anteriormente, veamos un ejemplo:

tinchicus@dbn001vrt:~/lenguajes/rust/herencia$ cargo build
   Compiling herencia v0.1.0 (/home/tinchicus/lenguajes/rust/herencia)
error[E0277]: the trait bound `Perro: Animal` is not satisfied
  --> src/main.rs:20:6
   |
20 | impl Mamifero for Perro
   |      ^^^^^^^^ the trait `Animal` is not implemented for `Perro`
   |
note: required by a bound in `Mamifero`
  --> src/main.rs:6:18
   |
6  | trait Mamifero : Animal
   |                  ^^^^^^ required by this bound in `Mamifero`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `herencia` due to previous error
tinchicus@dbn001vrt:~/lenguajes/rust/herencia$
Anuncios

En resumen, hoy hemos visto a herencia entre trait, como se hace, como trabaja mediante un ejemplo, para despues ver como trabaja realmente en el lenguaje y como nos puede ayudar en algunos casos, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50