1 | |
---|
2 | ////////////////////////////////////////////////////////////////////////////// |
---|
3 | |
---|
4 | // Se crea una clase CObjeto con un valor y un método GetValor |
---|
5 | |
---|
6 | Class CObjeto { |
---|
7 | Real valor; |
---|
8 | Real GetValor(Real void){ valor } |
---|
9 | }; |
---|
10 | |
---|
11 | // Se crea una clase CObjetoEspecial como una necesidad de extender |
---|
12 | // la clase CObjeto creando instancias tipo CObjeto ampliadas. |
---|
13 | |
---|
14 | Class CObjetoEspecial : CObjeto { |
---|
15 | Real signo; |
---|
16 | Real GetSigno(Real void){ signo }; |
---|
17 | Real GetValor(Real void){ GetSigno(0) * valor } |
---|
18 | }; |
---|
19 | |
---|
20 | // Esta clase tiene un atributo más que almacena un nuevo valor 'signo' |
---|
21 | // que modifica el resultado del método GetValor |
---|
22 | |
---|
23 | // [1] Creo un objeto común tipo CObjecto |
---|
24 | CObjeto obj1 = [[Real valor = 1]]; |
---|
25 | |
---|
26 | // [2] Creo un objeto especial tipo CObjetoEspecial |
---|
27 | CObjetoEspecial obj2 = [[Real valor = 1; Real signo = -1]]; |
---|
28 | |
---|
29 | // [3] Referencio al objeto especial como un CObjeto |
---|
30 | CObjeto obj3 = obj2; |
---|
31 | |
---|
32 | // Los métodos devuelven lo esperado: |
---|
33 | Real obj1::GetValor(0); // -> +1 |
---|
34 | Real obj2::GetValor(0); // -> -1 |
---|
35 | Real obj3::GetValor(0); // -> -1 |
---|
36 | |
---|
37 | ////////////////////////////////////////////////////////////////////////////// |
---|
38 | |
---|
39 | CObjetoEspecial CObjetoEspecial.New(NameBlock args) { |
---|
40 | CObjetoEspecial new = args |
---|
41 | }; |
---|
42 | |
---|
43 | // [4] Creo un objeto CObjetoEspecial mediante un constructor |
---|
44 | |
---|
45 | CObjetoEspecial obj4 = CObjetoEspecial.New([[ |
---|
46 | Real valor = 1; |
---|
47 | Real signo = -1 |
---|
48 | ]]); |
---|
49 | |
---|
50 | // Se obtiene lo esperado: |
---|
51 | Real obj4::GetValor(0); // -> +1 |
---|
52 | |
---|
53 | // [5] Si asignamos una referencia a un objeto de CObjeto |
---|
54 | // con una instancia de la clase derivada (CObjetoEspecial) |
---|
55 | // perdemos los métodos de la clase derivada. |
---|
56 | |
---|
57 | CObjeto obj5 = CObjetoEspecial.New([[ |
---|
58 | Real valor = 1; |
---|
59 | Real signo = -1 |
---|
60 | ]]); |
---|
61 | // obj5 no posee los métodos propios de CObjetoEspecial |
---|
62 | |
---|
63 | // Se obtiene algo inesperado: |
---|
64 | Real obj5::GetValor(0); // -> 1 (no es -1) |
---|
65 | |
---|
66 | // [6] para evitarlo debemos hacer: |
---|
67 | |
---|
68 | CObjeto obj6 = { |
---|
69 | CObjetoEspecial new = CObjetoEspecial.New([[ |
---|
70 | Real valor = 1; |
---|
71 | Real signo = -1 |
---|
72 | ]]) |
---|
73 | }; |
---|
74 | // obj6 no posee los métodos propios de CObjetoEspecial |
---|
75 | |
---|
76 | // Se obtiene lo esperado: |
---|
77 | Real obj6::GetValor(0); // -> -1 |
---|
78 | |
---|
79 | ////////////////////////////////////////////////////////////////////////////// |
---|