-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.swift
More file actions
220 lines (182 loc) · 5.39 KB
/
main.swift
File metadata and controls
220 lines (182 loc) · 5.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/*
Laboratorio 10 - Lenguajes de Programación
Swift
José Mario Carvajal Campos
2017146813
Profesora: Samanta Ramijan Carmiol
*/
//Esta clase representa a los instrumentos en general
class Instrumento {
let marca: String
//Constructor de la clase
init(marca: String) {
self.marca = marca
}
//Salida: String con mensaje de error
func melodia() -> String {
fatalError("Corre este método para \(marca)")
}
//Entrada: variable tipo Musica
//Salida: Notas musicales
func tocar(_ musica: Musica) -> String {
return musica.preparado()
}
//Entrada: variable tipo Musica
//Salida: String en terminal de las melodias
func presentar(_ musica: Musica) {
print(melodia())
print(tocar(musica))
}
}
//Clase donde las notas musicales se almacenan por cada instancia
class Musica {
let notas: [String]
//Constructor de la clase,inicializa notas
init(notas: [String]) {
self.notas = notas
}
//Retorna las notas de la clase
func preparado() -> String {
return notas.joined(separator: " ")
}
}
//Piano hereda de instrumento
class Piano: Instrumento {
let tienePedales: Bool
static let teclasBlancas = 52
static let teclasNegras = 36
init(marca: String, tienePedales: Bool = false) {
self.tienePedales = tienePedales
super.init(marca: marca)
}
Aqui modifica las dos funciones del padre
override func melodia() -> String {
return "Melodia de piano estandar para \(marca)."
}
override func tocar(_ musica: Musica) -> String {
return tocar(musica, usaPedales: tienePedales)
}
func tocar(_ musica: Musica, usaPedales: Bool) -> String {
let notasPreparadas = super.tocar(musica)
if tienePedales && usaPedales {
return "Tocar notas de piano \(notasPreparadas) con pedales."
}
else {
return "Tocar notas de piano \(notasPreparadas) sin pedales."
}
}
}
let piano = Piano(marca: "Yamaha", tienePedales: true)
piano.melodia()
let musica = Musica(notas: ["C", "G", "F"])
piano.tocar(musica, usaPedales: false)
piano.tocar(musica)
Piano.teclasBlancas
Piano.teclasNegras
//Guitarra hereda de instrumento
class Guitarra: Instrumento {
let calibreDeCuerda: String
init(marca: String, calibreDeCuerda: String = "medio") {
self.calibreDeCuerda = calibreDeCuerda
super.init(marca: marca)
}
}
//Guitarra acustica hereda de guitarra
class GuitarraAcustica: Guitarra {
static let numeroDeCuerdas = 6
static let cuentatraste = 20
override func melodia() -> String {
return "Melodia \(marca) acustica con E A D G B E"
}
override func tocar(_ musica: Musica) -> String {
let notasPreparadas = super.tocar(musica)
return "Tocar melodias folcloricas en los trastes \(notasPreparadas)."
}
}
let guitarraAcustica = GuitarraAcustica(marca: "Roland", numeroDeCuerdas: "ligero")
guitarraAcustica.melodia()
guitarraAcustica.tocar(musica)
//Nueva clase que defuine un amplificador
class Amplificador {
//Variable privadas que solo pueden ser vistas en esta //clase
private var _volumen: Int
private(set) var encendido: Bool
init() {
encendido = false
_volumen = 0
}
func conectado() {
encendido = true
}
func desconectado() {
encendido = false
}
var volumen: Int {
get {
return encendido? _volumen : 0
}
set {
_volumen = min(max(newValue, 0), 10)
}
}
}
//Guitarra electrica hereda de guitarra
class GuitarraElectrica: Guitarra {
let amplificador: Amplificador
init(marca: String, numeroDeCuerdas: String = "ligero", amplificador: Amplificador) {
self.amplificador = amplificador
super.init(marca:marca, numeroDeCuerdas: numeroDeCuerdas)
}
override func melodia() -> String {
amplificador.conectado()
amplificador.volumen = 5
return "Melodia \(marca) electrica con E A D G B E"
}
override func tocar(_ musica: Musica) -> String {
let notasPreparadas = super.tocar(musica)
return "Tocar solo \(notasPreparadas) con volumen \(amplificador.volumen)."
}
}
//Bajo hereda de guitarra
class Bajo: Guitarra {
let amplificador: Amplificador
init(marca: String,numeroDeCuerdas: String = "Pesada", amplificador: Amplificador) {
self.amplificador = amplificador
super.init(marca: marca, numeroDeCuerdas: numeroDeCuerdas)
}
override func melodia() -> String {
amplificador.conectado()
return "Melodia \(marca) bajo con E A D G"
}
override func tocar(_ musica: Musica) -> String {
let notasPreparadas = super.tocar(musica)
return "Tocar bajo \(notasPreparadas) con volumen \(amplificador.volumen)."
}
}
let amplificador = Amplificador()
let guitarraElectrica = GuitarraElectrica(marca: "Gibson", numeroDeCuerdas: "media", amplificador: amplificador)
guitarraElectrica.melodia()
let bajo= Bajo(marca: "Fender", numeroDeCuerdas: "Pesada", amplificador: amplificador)
bajo.melodia()
bajo.amplificador.volumen
guitarraElectrica.amplificador.volumen
bajo.amplificador.desconectado()
bajo.amplificador.volumen
guitarraElectrica.amplificador.volumen
bajo.amplificador.conectado()
bajo.amplificador.volumen
guitarraElectrica.amplificador.volumen
class Banda {
let instrumentos: [Instrumento]
init(instrumentos: [Instrumento]) {
self.instrumentos = instrumentos
}
func presentar(_ musica: Musica) {
for instrumento in instrumentos {
instrumento.presentar(musica)
}
}
}
let instrumentos = [piano, guitarraAcustica, guitarraElectrica, bajo]
let banda = Banda(instrumentos: instrumentos)
banda.presentar(musica)