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