Herencia
La herencia es una forma de reutilizar código en la programación orientada a objetos. A través de herencia, una clase puede recibir los métodos de otra clase.
Para indicar que una clase hereda de otra se utiliza el operador < en la definición de la clase seguido del nombre de la clase que se quiere extender (heredar). Por ejemplo:
1
# Clase Padre
2
class Figure
3
attr_accessor: :stroke, :fill
4
end
5
6
# Hereda de Figure
7
class Circle < Figure
8
attr_accessor :radius
9
end
10
11
# Hereda de Figure
12
class Square < Figure
13
attr_accessor :side
14
...
15
end
16
17
# Hereda de Figure
18
class Triangle < Figure
19
attr_accessor :base, :height
20
end
Copied!
En este caso Circle, Square y Triangle heredan de Figure, es decir, que tienen todos los métodos se definan en Figure (en este caso los métodos para leer y escribir stroke y fill). Por ejemplo:
1
c1 = Circle.new
2
c1.fill = "red"
3
puts c1.fill
Copied!

Jerarquía de clases

Una clase puede ser padre de muchas otras clases, e hija de otra al mismo tiempo.
1
class Figure
2
...
3
end
4
5
class Circle < Figure
6
attr_accessor :radius
7
end
8
9
class Cylinder < Circle
10
attr_accessor :length
11
end
Copied!
Circle es hija de Figure y padre de Cylinder. A medida que se van creando más clases se va creando una jerarquía de clases.

Object

En Ruby la clase Object es la clase padre de todas las clases que no hereden de alguna otra. Object define métodos como class, to_s, methods, respond_to?, nil?, is_a?, entre otros. Puedes ver la lista completa en la documentación de la clase Object. Todos estos métodos están disponibles en cualquier clase de Ruby.
Nota: Object extiende de otra clase llamada BasicObject, que es la raíz de toda la jerarquía de clases en Ruby, pero esa es una clase vacía, así que en la práctica puedes pensar en Object como la clase raíz.

Sobrescribiendo métodos

Es posible sobreescribir los métodos de la clase padre definiendo un método que se llame igual en la clase hija. Por ejemplo, es muy común sobrescribir el método to_s que está definido en Object:
1
class Circle < Figure
2
...
3
4
def to_s
5
"Este es un círculo con radio #{@radius}"
6
end
7
end
Copied!
Nota: No es necesario que el método esté definido directamente en la clase padre, puede estar más arriba en la jerarquía como en este ejemplo.
Puedes utilizar la palabra clave super para invocar el método padre. Por ejemplo:
1
class Employee
2
def salary
3
puts "Calculando salario"
4
end
5
end
6
7
class Manager < Employee
8
def salary
9
puts "Calculando bonos"
10
super # esta línea llama el método salary de Employee
11
end
12
end
Copied!

Herencia y el constructor

El constructor se hereda y se puede sobrescribir como cualquier otro método. La única restricción es que si vas a usar super debe ser la primera línea del initialize, de lo contrario sale un error.
1
class Parent
2
def initialize
3
puts "Este es el constructor de Parent"
4
end
5
end
6
7
class Child
8
def initialize
9
super # llama el constructor de Parent
10
# acá puede ir más código
11
end
12
end
Copied!
Last modified 3yr ago