Herència
La herència es pot definir com el procés de crear classes a partir d’altres classes.
Les classes pare són les classes de les quals s’hereta, també són conegudes com les classes base.
Les classes filles són les que estan basades en les classes pares o base. També es coneixen com a subclasses.
1. Sintaxi
La sintaxi per a poder heretar és utilizar el símbol <
i la classe pare.
< Video
La classe YouTubeVideo
hereta totes les propietats de la classe pare, així que es comportarà igual.
Així:
class Video
attr_accessor :title,:duration
end
class YouTubeVideo < Video
attr_accessor :youtube
end
D’aquesta manera:
class Video
attr_accessor :title,:duration
end
class YouTubeVideo < Video
attr_accessor :youtube
end
yt = YouTubeVideo.new
yt.title = "Herencia en Ruby"
puts yt.title
La subclasse YouTubeVideo
hereta l’atribut :title
de son pare.
Així podem assignar un títol i podem veure’l després.
Output
Herencia en Ruby
La subclasse té totes les modificacions.
Exemplifiquem que podem afegir noves variables en la classe filla.
class Video
attr_accessor :title,:duration
end
class YouTubeVideo < Video
attr_accessor :youtube_id
end
yt = YouTubeVideo.new
yt.title = "Herencia en Ruby"
yt.youtube_id = "exemple"
puts yt.title
puts yt.youtube_id
Output
Herencia en Ruby
exemple
Les classes filla estan vistes com una expecialització del pare.
Un dels avantatges de l’herencia és no haver d’escriure nou codi.
1. Dos tipus de classes
Suposem que tinguem dos tipus de vídeos, un per a Facebook i un per a YouTube.
class FacebookVideo
attr_accessor :tittle
attr_accessor :duration
attr_accessor :facebook_id
end
class YouTubeVideo
attr_accessor :tittle
attr_accessor :duration
attr_accessor :facebook_id
end
Imaginem que volem agregar als vídeos una propietat descripció. Caldria agregar-ho a les dues classes.
class FacebookVideo
attr_accessor :tittle
attr_accessor :duration
attr_accessor :facebook_id
attr_accessor :description
end
class YouTubeVideo
attr_accessor :tittle
attr_accessor :duration
attr_accessor :facebook_id
attr_accessor :description
end
Per canviar el contingut d’un atribut caldria canviar-ho en cada atribut, en aquest cas, si volem canviar el títol cal canviar-ho en les dues classes.
Exemple:
class FacebookVideo
attr_accessor :titulo01
attr_accessor :duration
attr_accessor :facebook_id
attr_accessor :description
end
class YouTubeVideo
attr_accessor :titulo02
attr_accessor :duration
attr_accessor :facebook_id
attr_accessor :description
end
La millor forma d’utilizar això és fer-ho servir mitjançant herència.
Així, creariem una classe pare i dues classes filles:
class Video
attr_accessor :tittle
attr_accessor :duration
attr_accessor :facebook_id
end
class FacebookVideo < Video
attr_accessor :facebook_id
end
class YouTubeVideo < Video
attr_accessor :youtube_id
end
En Ruby les classes soles poden heretar d’una superclasse o d’una sola classe pare. En altres llenguatges existeix el concepte d’herència múltiple, però en el cas de Ruby no.
3. Habilitat de sobreescriure un mètode o override
Definim el mètode en la classe pare:
def embed_video_code
"<video></video>"
end
Redefinim el mètode en la classe filla:
def embed_video_code
"<iframe />"
end
Ara ho veiem tot junt:
class Video
attr_accessor :tittle
attr_accessor :duration
attr_accessor :facebook_id
def embed_video_code
"<video></video>"
end
end
class FacebookVideo < Video
attr_accessor :facebook_id
end
class YouTubeVideo < Video
attr_accessor :youtube_id
def embed_video_code
"<iframe />"
end
end
puts YouTubeVideo.new().embed_video_code
Això se li anomena override
4. Aprofitar la funcionalitat del pare i fer coses específiques en la filla
Suposem que definim un mètode en el pare:
def setup(title)
@title = title
end
Què passaria si volerem aprofitar aquesta lògica en la filla:
Imagigem que volem aprofitar la funcionalitat del pare i inicialitzar l’API de YouTube.
def setup(title)
super
# YouTubeAPI.ini()
end
Així, tot junt:
class Video
attr_accessor :title
attr_accessor :duration
attr_accessor :facebook_id
def embed_video_code
"<video></video>"
end
def setup(title)
@title = title
end
end
class FacebookVideo < Video
attr_accessor :facebook_id
end
class YouTubeVideo < Video
attr_accessor :youtube_id
def embed_video_code
"<iframe />"
end
def setup(title)
super
# YouTubeAPI.ini()
puts "Algo extrAlgo extra"
end
end
yt = YouTubeVideo.new
yt.setup("Herencia Ruby")
puts yt.title
Output
Algo extra
Herencia Ruby
5. Totes les classes hereden l’algú
Totes les classe hereten d’object
, per exemple un mètode definit en object és object_id
.
12:20 min inacabat, per exemples
Per tal de crear mètodes per a tots els objectes del programa caldria crear una classe object i cridar-la (al final de l’arxiu) des de tots els objectes.
class Object
def i_have_superpowers
puts "Este método está en TODOS los objectos"
end
end
class Video
attr_accessor :title
attr_accessor :duration
attr_accessor :facebook_id
def embed_video_code
"<video></video>"
end
def setup(title)
@title = title
end
end
class FacebookVideo < Video
attr_accessor :facebook_id
end
class YouTubeVideo < Video
attr_accessor :youtube_id
def embed_video_code
"<iframe />"
end
def setup(title)
super
# YouTubeAPI.ini()
puts "Algo extra"
end
end
puts 1.object_id
puts YouTubeVideo.new.object_id
[].i_have_superpowers
"".i_have_superpowers
10.i_have_superpowers
Video.new.i_have_superpowers
YouTubeVideo.i_have_superpowers
Output
3
15323700
Este método está en TODOS los objectos
Este método está en TODOS los objectos
Este método está en TODOS los objectos
Este método está en TODOS los objectos
Este método está en TODOS los objectos
Font: Código Facilito