Escolar Documentos
Profissional Documentos
Cultura Documentos
1. Introdução
1 É uma associação feita pelo compilador/interpretador entre um atributo e uma entidade que ocorre durante o tempo de execução
ou muda durante a execução do programa.
2 A designação depende da linguagem de programação. Para o programador, self-reference aparece tipicamente na forma de uma
pseudovariavel especial, self. Pode ser usada explicitamente para informar o sistema que está pedido late-binding via self-
reference.
3 São classes cujas instâncias também são classes. Dependendo da linguagem de programação utilizada existe/não existe suporte
implícito/explicito.
1
Em segundo lugar, é definido o conceito de herança, efectuada uma breve
síntese da sua evolução, e são mencionadas aplicações desse conceito, no contexto da
sua utilização prática. Em seguida, são apresentadas duas formas básicas de
implementação da herança: Delegação e Concatenação. São citadas algumas
linguagens de POO que as aplicam e apresentadas as vantagens e desvantagens da
delegação versus concatenação.
Um protótipo pode ser pensado como, por exemplo, uma instância, que
representa o comportamento de alguns conceitos. Conforme foi dito anteriormente os
sistemas baseados em protótipos não apresentam classes, pelo que, não existe a noção
de instância (Lieberman, 1986). O efeito de instanciação é a possibilidade de criar
vários objectos com características similares, com a possibilidade de se modificarem
individualmente, utilizando um processo de cópia.
2
Não existe um modelo standard de implementação de sistemas baseados em
protótipos. Anteriormente, foram mencionadas várias linguagens de programação, que
apresentam características muito diferentes. Porém, as mesmas podem ser divididas em
duas categorias: linguagens baseadas em delegação e linguagens baseadas em cópia
(cloning). Nas linguagens baseadas em delegação há um mecanismo especial
“Delegation” que fornece a potencialidade incremental da modificação no
desenvolvimento de software (Lieberman 1986).
(Taivalsaari 1995).
3
Ungar, Chambres, Chang Holzle (1991), referiram que a linguagem Self pode
incorporar tarefas realizadas em linguagens baseadas em classes. Esta linguagem
diferencia dois tipos de objectos: Traits4 e prototypes5.
3. Herança
4 Descrevem o ambiente do objecto. Correspondem às classes num sistema OO baseado em classes (Ungar, Chambres, chang Holzle, 1991)
5 Contém a informação. Correspondem às instâncias num sistema OO baseado em classes(Ungar, Chambres, chang Holzle, 1991)
6 Podemos adicionar um comportamento específico (implementação) às subclasses de uma hirerarquia de
generalização/especialização - Poliformismo
4
bibliotecas de classes. Subtyping suporta reutilização para que o utilizador da biblioteca
da classe possa saber que classes podem ser substituídas por outras classes. A Relação
de Especialização (É-um ), por sua vez, é importante para compreender os
relacionamentos lógicos entre os conceitos; neste sentido, a especialização é importante
para o programador da biblioteca da classe. Brachman identificou vários tipos de
relações É- um. Wegner distinguiu subtyptes (subset subtyping; Isomorphic copy
subtyping; Object-oriented subtyping) de subtyping.
Conforme foi dito anteriormente, a herança pode ser vista sobre diferentes
aspectos. Usos diferentes focalizam propriedades diferentes, tais como o
comportamento externo dos objectos, estrutura interna do objecto, estrutura da
hierarquia da herança, ou nas propriedades do software.
5
Conforme referido anteriormente, grande parte dos sistemas orientados a
objectos permitem herança múltipla (figura 2, figura 3 e figura 4). Ou seja, é a
possibilidade de se definir uma subclasse com mais de uma superclasse.
Conceptualmente, a herança múltipla é necessária para modelar o mundo real. No
entanto, pode levar a problemas de implementação nomeadamente colisões (collisions).
Figura 2 –Herança múltipla em linguagens baseadas em Figura 3 –Herança múltipla em linguagens Figura 4 – Herança múltipla em
classes baseadas protótipos por concatenação linguagens baseadas em protótipos por
Fonte : Taivalsaari (1995) delegação
Fonte: Chambers et al. (1991)
6
Figura 5- Herança dinâmica
Fonte: , Schofield (2007)
7
Como conclusão pode referir-se que a comunidade científica ainda não chegou a
nenhuma conclusão sobre o uso apropriado da herança. Embora a especialização seja
considerada como a única razão legítima para a usar.
Cook (1989) refere que de uma maneira geral a herança pode ser definida como
uma combinação de operações.
R= P ⊕ △R
Suponhamos que pretendemos definir outro objecto, designado Child que herda
as propriedades do pai e é-lhe adicionado mais uma variável e mais um método.
7 Identificadores de objectos são usados por objectos para identificar univocamente outros objectos. Adiciona-se um novo
identificador atribuindo ao identificador um nome diferente dos nomes dos identificadores já existentes.
8 A relação classe /subclasse é representada por DGA (Grafo Dirigido Acíclico)
8
Relação do descendente por delegação:
Child: - [VAR pv1; VAR pv2; METHOD pm1; VAR cv1; METHOD cm1 ]
Nota: Os valores reais das variáveis e execução dos métodos foram omitidos.
Borning (1986) apresentou uma linguagem baseada em protótipos que não tinha
necessariamente de usar delegação. Demonstrou que utilizando a cópia (cloning) e a
possibilidade de adicionar dinamicamente novas propriedades aos objectos, na presença
de vários mecanismos de envio de mensagem late-binding, é possível capturar a
essência da herança. No entanto, esta linguagem apresentou alguns problemas,
nomeadamente na capacidade de memória requerida e na maior dificuldade de cópia e
modificação dos objectos.
9
lado, a implementação da herança em smalltalk, linguagem baseada em classes, é
idêntica à herança por delegação implementada em Self, linguagem baseada em
protótipos. Em ambas as linguagens as mensagens não resolvidas são enviadas para
estruturas separadas. Em Smalltalk é usada uma superclasse, e no Self é utilizado um
objecto pai.
Delegação Concatenação
Smalltalk Simula
Sistemas baseados
Ómega Beta
em classes
Self
IO Kevo
Sistemas baseados Máquina virtual Zero Omega
em protótipos (ainda não possui uma linguagem de
programação de alto nível)
10
Herança Vantagens Desvantagens
- O modelo conceptual é extremamente - É menos flexível que o Self em tempo
simples e fácil de ensinar (1). de execução (1) (3).
- Os objectos são auto-suficientes, ou seja - Não é possível modificar os pais de
para se compreender o ambiente de um um objecto em tempo de execução, (1).
objecto não é necessário compreender e
- Devido à natureza linear dos objectos
hierarquia da estrutura (1).
não pode ser dada prioridade à herança
- Podem ser adicionadas novas variáveis múltipla, como no Self (1).
que se propagam facilmente aos outros
elementos do grupo (1).
Concatenação - A estrutura linear, do objecto auto-
suficiente permite optimizar o envio da
mensagem (1).
- As relações implícitas do objecto
escondem a implementação das decisões
sobre a partilha/duplicação e são, assim,
mais apropriadas para a programação
concorrente e distribuída (1).
- A combinação da relação do objecto não
requer nenhum conceito de partilha (1).
- Espaço eficiente de partilha (2). - Cria dependências da Web tornando
os sistemas frágeis (2) .
- Utilização conveniente da herança
dinâmica. Preserva as mudanças (2) - Não adaptável ao ensino (3).
- Privilegia a herança dinâmica (4) - Difícil de implementar (3).
Delegação
-Integra bem linguagens/ambientes (2)
- Maleabilidade e reusabilidade (4).
- Facilidade de construção dos programas,
manutenção e extensão (4).
Tabela3 – Vantagens e Desvantagens das estratégias de implementação da herança
Fonte: (1) Taivalsaari (1995, 1996); (2) Cardelli (3) Schofield (2004,2007); (4) Chambers, et al. (1991)
4.1 Self
Mecanismo
Objectos
11
A interacção com um objecto é feita através da emissão de uma mensagem. O
nome da mensagem, chamado selector, é combinado com o nome do slot. O slot
responde de acordo com o seu tipo. Há dois tipos de slots: method slots, e data slots. O
method slot contem um método (isto é um código executável) (Ungar e Smith, 1987).
Herança
A herança no Self é efectuada fazendo data slots em parent slots. Os parent slots
delegam mensagens nos objectos que são referidos no caso de o selector de uma
mensagem não ser combinado com nenhum slot do objecto. Isto significa que um
método somente tem que ser escrito uma vez. Quando contido num objecto especial,
chamado trait, esse método pode ser usado por qualquer outro objecto (Chambers et al.,
1991).
4.2 Kevo
Mecanismo
Objectos
Herança
12
Taivalsaari (2005) refere o seguinte exemplo:
GraphicThing :- Clonable.clone;
GraphicThing ADDS [
VAR x :- 20;
VAR y :- 10;
METHOD draw :- { ... };
]
Os objectos Ball and Bat foram construídos de uma maneira similar clonando o objecto
GraphicThing, e depois foram-lhe adicionadas novas variáveis e operações.
Ball :- GraphicThing.clone;
Ball ADDS [
VAR xStep :- 1;
VAR yStep :- 1;
METHOD bounce :- { ... increment ball location ... self.draw... };
METHOD serve :- { ... initialize ball location ... self.draw ...};
]
Bat :- GraphicThing.clone;
Bat ADDS [
METHOD moveUp :- { ... decrement y-coordinate ... self.draw... };
METHOD moveDown :- { ... increment y-coordinate ... self.draw ...};
]
13
4.3 Máquina Virtual Zero
Zero é uma máquina virtual, pequena e simples (Zero, 2007 e Schofield et al.,
2004), baseada em protótipos, que teve origem em 2003, na Universidade de Vigo e foi
inspirada em “The Design and Evolution of C++”, de Bjarne Stroupstrup, em 1991. Os
objectivos da sua criação foram os seguintes: 1º Dotar os estudantes de um sistema OO
puro, onde seja possível incluir persistência ortogonal baseada em containers; 2º
Proporcionar que as linguagens de programação OO baseadas em protótipos se tornem
adequadas à docência; e 3º Ser um sistema minimalista, ou seja pequeno e simples,
nomeadamente no que se refere à sua performance. (Zero, 2007)
Mecanismo
Objectos
Não existe uma divisão especial entre objectos e protótipos. Os protótipos são
objectos definidos em tempo de compilação. Os objectos criam-se através da clonagem
dos primeiros, em tempo de execução. É, ainda, possível, em tempo de compilação
clonar um objecto, eliminar-lhe ou adicionar-lhe atributos e métodos e aplicá-lo como
protótipo. É possível, também, criar um objecto vazio herdado de outro, passando a
mensagem createchild() e adicionar-lhe os métodos e os atributos(variáveis)
necessários (Schofield et al., 2004).
Herança
Simples
14
Existe um atributo especial denominado parent que identifica o pai de um
objecto. No exemplo seguinte PruebaPunto herda de Console Application.
! ================================
! Creación de un objeto Punto
! Ejemplo de programación en Zero
! ================================
object Punto
attribute + x = 0
attribute + y = 0
method + mueve(a, b)
isInstanceOf Float, a
jumpOnTrueTo testB
throw EMismatch ! No lo es
:testB
isInstanceOf Float, b ! Es un número ?
jumpOnTrueTo fin
throw EMismatch ! No lo es
:fin
x=a
y=b
return
endMethod
method + toString()
reference toret
toret = "("
toret = toret.concat(x.toString())
toret = toret.concat(", ")
toret = toret.concat(y.toString())
toret = toret.concat(")")
return toret
endMethod
endObject
__this.prepare() ! Inicializaciones
miPunto.mueve(x, y) ! mover al punto
System.console.write(miPunto) ! Visualizar el punto
System.console.lf()
return
endMethod
endObject
Herança Dinâmica
15
! Herencia dinámica -- demostración
! Debe ser guardado como "Dinamica.zm"
method + add(name,obj)
System.console.write("MapaVacio::add")
System.console.lf()
__this.^add(name, obj)
parent = MapaNoVacio
return
endMethod
endObject
5. Conclusões
Pode ser vista sobre diferentes aspectos. Usos diferentes focalizam propriedades
diferentes, tais como: o comportamento externo dos objectos, estrutura interna do
objecto, estrutura da hierarquia da herança ou propriedades das linguagens de
programação.
16
herança dinâmica - possibilidade de mudar dinamicamente os pais dos objectos em
tempo de execução. Desta forma, um objecto pode ser “filho” de vários objectos,
dependendo do tempo de execução.
6. Bibliografia
CHAMBERS, C., UNGAR, D., CHANG, B.-W. AND HO¨ LZLE, U. (1991). Parents
are shared parts of objects: inheritance and encapsulation in Self. Lisp Symbolic
Comput. 4, 3 (Jun.).
17
SCHOFIELD G., ROSELLÓ E., DACOSTA J., COTA PEREZ M.. (2004). "
Programación orientada a objetos educativa en una máquina virtual orientada a
objetos ". Em proceedings of the VII Congreso Iberoamericano de Informática
Educativa, Monterrey, México
UNGAR, Chambers et al. (1991). “Organizing programs without classes”. Lisp and
Symbolic Computation 4(3), Kluwer Academic Publishers,
18