close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Ticket #730: ticket_7.DerivedClassAsMainClassInstances_MOD.tol

File ticket_7.DerivedClassAsMainClassInstances_MOD.tol, 2.1 KB (added by pgea@…, 16 years ago)
Line 
1
2//////////////////////////////////////////////////////////////////////////////
3
4// Se crea una clase CObjeto con un valor y un método GetValor
5
6Class 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
14Class 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
24CObjeto obj1 = [[Real valor = 1]];
25
26// [2] Creo un objeto especial tipo CObjetoEspecial
27CObjetoEspecial obj2 = [[Real valor = 1; Real signo = -1]];
28
29// [3] Referencio al objeto especial como un CObjeto
30CObjeto obj3 = obj2;
31
32// Los métodos devuelven lo esperado:
33Real obj1::GetValor(0);  // -> +1
34Real obj2::GetValor(0);  // -> -1
35Real obj3::GetValor(0);  // -> -1
36
37//////////////////////////////////////////////////////////////////////////////
38
39CObjetoEspecial CObjetoEspecial.New(NameBlock args) {
40  CObjetoEspecial new = args
41};
42
43// [4] Creo un objeto CObjetoEspecial mediante un constructor
44
45CObjetoEspecial obj4 = CObjetoEspecial.New([[
46  Real valor = 1;
47  Real signo = -1
48]]);
49
50// Se obtiene lo esperado:
51Real 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
57CObjeto 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:
64Real obj5::GetValor(0); // -> 1 (no es -1)
65
66// [6] para evitarlo debemos hacer:
67
68CObjeto 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:
77Real obj6::GetValor(0); // -> -1
78
79//////////////////////////////////////////////////////////////////////////////