Bienvenidos sean a este post, hoy hablaremos sobre uno de los temas mas importantes en OOP.
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
En nuestro caso no lo haremos con las clases sino con los trait, su sintaxis es bien simple:
trait nombre : trait_base
{
... instrucciones ...
}
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.
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();
}
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.
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$
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
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$
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.


Donación
Es para mantenimento del sitio, gracias!
$1.50
