Skip to content

Commit 252ea2f

Browse files
authored
Merge pull request mouredev#6451 from parababire/main
#29 - Javascript
2 parents 2c1db6a + d22563f commit 252ea2f

File tree

1 file changed

+169
-0
lines changed

1 file changed

+169
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
// Incorrecto
2+
3+
/* class Animal {
4+
constructor(name) {
5+
this.name = name
6+
if (new.target === Animal) {
7+
throw new Error('Animal es una interface y no puede ser instanciada')
8+
}
9+
if (!this.eat) {
10+
throw new Error('Debe implimentar el método eat')
11+
}
12+
if (!this.fly) {
13+
throw new Error('Debe implimentar el método fly')
14+
}
15+
if (!this.swim) {
16+
throw new Error('Debe implimentar el método swim')
17+
}
18+
}
19+
}
20+
21+
class Fish extends Animal {
22+
eat() {
23+
console.log(`${this.name} is eating`)
24+
}
25+
swim() {
26+
console.log(`${this.name} is swimming`)
27+
}
28+
fly() {
29+
console.error("ERROR! Fishes can't fly")
30+
}
31+
}
32+
33+
class Bird extends Animal {
34+
eat() {
35+
console.log(`${this.name} is eating`)
36+
}
37+
swim() {
38+
console.error("ERROR! Birds can't swim");
39+
}
40+
fly() {
41+
console.log(`${this.name} is flying`)
42+
}
43+
}
44+
45+
const bird = new Bird('Titi the Parrot');
46+
bird.swim(); // ERROR! Birds can't swim
47+
48+
const fish = new Fish('Neo the Dolphin');
49+
fish.fly(); // ERROR! Fishes can't fly
50+
*/
51+
// Correcto
52+
53+
class Swimmer {
54+
constructor(name) {
55+
this.name = name
56+
if (new.target === Swimmer) {
57+
throw new Error('Swimmer es una interface y no puede ser instanciada')
58+
}
59+
if (!this.swim) {
60+
throw new Error('Debe implimentar el método swim')
61+
}
62+
}
63+
}
64+
65+
class Flyer {
66+
constructor(name) {
67+
this.name = name
68+
if (new.target === Flyer) {
69+
throw new Error('Flyer es una interface y no puede ser instanciada')
70+
}
71+
if (!this.fly) {
72+
throw new Error('Debe implimentar el método eat')
73+
}
74+
}
75+
}
76+
77+
// Implement interfaces for specific types of animals
78+
79+
class Bird extends Flyer {
80+
constructor(name) {
81+
super(name);
82+
}
83+
fly() {
84+
console.log(`${this.name} is flying`);
85+
}
86+
eat() {
87+
console.log(`${this.name} is eating`);
88+
}
89+
}
90+
91+
class Fish extends Swimmer {
92+
constructor(name) {
93+
super(name);
94+
}
95+
swim() {
96+
console.log(`${this.name} is swimming`);
97+
}
98+
eat() {
99+
console.log(`${this.name} is eating`);
100+
}
101+
}
102+
103+
// Usage
104+
105+
const bird = new Bird('Titi the Parrot');
106+
bird.fly(); // Titi the Parrot is flying
107+
bird.eat(); // Titi the Parrot is eating
108+
109+
console.log('\n');
110+
111+
const fish = new Fish('Neo the Dolphin');
112+
fish.swim(); // Neo the Dolphin is swimming
113+
fish.eat(); // Neo the Dolphin is eating
114+
115+
// Extra
116+
117+
class Printer {
118+
constructor() {
119+
if (new.target === Printer) {
120+
throw new Error("Printer es una interface no puedes instanciarla.")
121+
}
122+
if (!this.print) {
123+
throw new Error("Debes implementar el método print")
124+
}
125+
}
126+
}
127+
128+
class BlackAndWhitePrinter extends Printer {
129+
print() {
130+
console.log("Se imprime en blanco y negro.")
131+
}
132+
}
133+
134+
class ColorPrinter extends Printer {
135+
print() {
136+
console.log("Se imprime a color.")
137+
}
138+
}
139+
140+
const sendingFax = {
141+
sendFax() {
142+
console.log("Enviando fax.")
143+
}
144+
}
145+
146+
const scanner = {
147+
scanning() {
148+
console.log("Escaneando documento.")
149+
}
150+
}
151+
152+
Object.assign(ColorPrinter.prototype, sendingFax)
153+
Object.assign(ColorPrinter.prototype, scanner)
154+
155+
const multifuncional = new ColorPrinter()
156+
multifuncional.print()
157+
multifuncional.sendFax()
158+
multifuncional.scanning()
159+
160+
function testInterface(object, interface) {
161+
const prototypeProperties = Object.getOwnPropertyNames(interface.prototype)
162+
163+
for (const method of prototypeProperties) {
164+
if (!object[method] || typeof object[method] !== 'function') {
165+
throw new Error(`La clase no implementa el método ${method} de la interface.`)
166+
}
167+
}
168+
}
169+
testInterface(multifuncional, Printer)

0 commit comments

Comments
 (0)