Guest User

Untitled

a guest
Oct 18th, 2018
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. Para hacer algunos ejemplos de herencia, métodos y atributos de clase vamos a modelar un sistema de nómina para una compañía.
  2.  
  3. Empezamos con una clase `Employee` de la cual van a extender otras clases:
  4.  
  5. ```ruby
  6. class Employee
  7. attr_reader :name, :email, :salary
  8.  
  9. def initialize(attrs)
  10. @name = attrs[:name]
  11. @email = attrs[:email]
  12. @password = attrs[:password]
  13. @salary = attrs[:salary]
  14. end
  15.  
  16. def validate_password
  17. password.length >= 5 && password.length <= 40
  18. end
  19. end
  20. ```
  21.  
  22. Acá es importante mencionar que podríamos haber recibido múltiples argumentos en el `initialize`, pero cuando son más de dos argumentos es mejor utilizar un hash:
  23.  
  24. ```ruby
  25. e1 = Employee.new(name: "Pedro", email: "pedro@gmail.com", password: "test1234", salary: 200)
  26. ```
  27.  
  28. Hay dos tipos de empleados: `Manager` y `Worker`. Los dos extienden de `Employee`. El ejercicio es primero definirlos:
  29.  
  30. ```ruby
  31. class Manager < Employee
  32. def initialize(attrs={})
  33. super(attrs) # también es posible copiar lo del padre pero es mejor así
  34. end
  35. end
  36.  
  37. class Worker < Employee
  38. def initialize(attrs={})
  39. super(attrs)
  40. end
  41. end
  42. ```
  43.  
  44. Un ejercicio adicional es instanciar un `Manager` y un `Worker` y mostrar la clase de cada uno (se les dice que con el método `class` pueden obtener la clase):
  45.  
  46. ```ruby
  47. m1 = Manager.new
  48. puts m1.class # Manager
  49.  
  50. w1 = Worker.new
  51. puts w1.class # Worker
  52. ```
  53.  
  54. Los `Woker`s tienen un atributo adicional `hours` que inicia en 0 y que representa el número de horas que han trabajado y un método `work` que reciba un parámetro con el número de horas que se deben sumar:
  55.  
  56. ```ruby
  57. class Worker < Employee
  58. attr_reader :hours
  59.  
  60. def initialize(attrs)
  61. super(attrs)
  62. @hours = 0
  63. end
  64.  
  65. def work(hours)
  66. @hours += hours
  67. end
  68. end
  69. ```
  70.  
  71. Los `Manager`s tienen unos `Worker`s a su cargo y deben tener un método `report` que devuelve el número de horas totales trabajadas por sus `Worker`s:
  72.  
  73. ```ruby
  74. class Manager < Employee
  75. attr_reader :workers
  76.  
  77. def initialize(attrs)
  78. super(attrs)
  79. @workers = attrs[:workers]
  80. end
  81.  
  82. def report
  83. total = 0
  84. @workers.each do |worker|
  85. total += worker.hours
  86. end
  87. total
  88. end
  89. end
  90. ```
  91.  
  92. Driver code, esto se les puede mostrar para que vean cómo se va a utilizar:
  93.  
  94. ```ruby
  95. pedro = Worker.new(name: "Pedro", email: "pedro@gmail.com", password: "test1234", salary: 200)
  96. juan = Worker.new(name: "Juan", email: "juan@gmail.com", password: "test1234", salary: 200)
  97.  
  98. joshua = Manager.new(name: "Joshua", email: "joshua@gmail.com", password: "test1234", salary: 1000, workers: [pedro, juan])
  99.  
  100. pedro.work(10)
  101. juan.work(20)
  102. pedro.work(10)
  103.  
  104. puts "Los trabajadores de Joshua trabajaron #{joshua.report} horas"
  105. ```
  106.  
  107. ## Polimorfismo
  108.  
  109. El siguiente ejercicio es modificar `Employee` para cargar una lista de employees:
  110.  
  111. ```ruby
  112. def Employee
  113. def self.find_all
  114. pedro = Worker.new(name: "Pedro", email: "pedro@gmail.com", password: "test1234", salary: 200)
  115. juan = Worker.new(name: "Juan", email: "juan@gmail.com", password: "test1234", salary: 200)
  116.  
  117. joshua = Manager.new(name: "Joshua", email: "joshua@gmail.com", password: "test1234", salary: 1000, workers: [pedro, juan])
  118.  
  119. [pedro, juan, joshua]
  120. end
  121. end
  122.  
  123. employees = Employee.find_all
  124. employees.each do |e|
  125. text = "El empleado #{e.name} es un #{e.class}"
  126. if e.is_a? Manager
  127. text += " y su grupo ha trabajado #{e.report} horas"
  128. elsif e.is_a? Worker
  129. text += " y ha trabajado #{e.hours} horas"
  130. end
  131. end
  132. ```
  133.  
  134. ## Sobrescribiendo métodos
Add Comment
Please, Sign In to add comment