Você está na página 1de 75

Adaptado de

cba
aos herdados
• Qualquer subclasse de uma classe abstrata a ser instanciada deve
fornecer implementações (definições) para todos os métodos
abstratos herdados
A adição de 7 a uma variável chamada x ocorre pelo envio do
objeto 7 como um parâmetro para o método + do objeto x.
devido a existência
das duas abordagens
(estruturados)

; a mistura de tipos
pode ser um problema, o que exige classes wrapper
. Manter a mesma quantidade e tipo de parâmetros e de retorno
para métodos sobrescritos e sobrescrevedores garante a conformidade

subtype Small_Int is Integer range -100..100;


display display

display
Implicitamente ou explicitamente?
usando um coletor de lixo
C++ não inclui recuperação de armazenamento implícita
, pode ser autocontida
class base_class {
private:
int a;
float x;
protected:
int b;
float y;
public:
int c;
float z; class subclass_1 : public base_class { ... };
}; class subclass_2 : private base_class { ... };
Aninhamento de classes
Construtor chama implicitamente
o construtor da classe base
É preciso reexportar empty,
pois ele se tornará privado
• Smalltalk é desprovida de tipos, todo o código é genérico; C++ usa templates
como possibilidade de códigos genéricos
myArray.add(new Integer(10)); myArray.add(10);
Integer é a classe wrapper para int aqui é feito um autoboxing
não é
(arquivos, por exemplo)
ou ainda ser derivada de outra e implementar uma interface, o que toma o
lugar de uma segunda classe pai

mais proximo possível


de uma herança múltipla
• Diferente de C++, onde a vinculação dinâmica somente acontece quando um
método é definido como virtual
• Classes aninhadas estáticas não possuem tal referência e por isso não podem
acessar membros da aninhadora

• Uma instância de uma classe aninhada pode existir apenas dentro de uma
instância de sua aninhadora
• Aderência mais consistente aos princípios de orientação a objetos
do que C++

• Controle de acesso é mais simples do que em C++


public class NewClass : ParentClass { ... }

. Exemplo: base.Draw();
A definição é feita em um pacote
separado para permitir compilação
independente

Student possui as entidades de Person


E adiciona novas entidades

O procedimento display é redefinido


• Esse tipo polimórfico representa todos os tipos em uma hierarquia de
classes cuja raiz é de um tipo em particular

package Base_Pkg is
type T is abstract tagged null record;
procedure Do_It (A : T) is abstract;
end Base_Pkg;
• Também é possível definir ponteiros polimórficos
type Any_Person_Ptr is access Person'class;
e destrutores
, assim como em Smalltalk

e isso não pode ser modificado


• O símbolo menor que (<) é usado para definir uma subclasse
class MySubClass < BaseClass
• O mesmo que em Smalltalk
• Suporte a OO no sentido mais puro
• Armazenamento de dados de instâncias

, algo próximo a maneira como as structs são tratadas


• Vinculação dinâmica de chamadas a métodos
vtable de A

ponteiro para vtable código para


Registro de draw de A
instância de
classe para A a código para
area de A
b

vtable de B

código para
Registro de ponteiro para vtable area de A
instância de código para
classe para B a
draw de B
b código para
sift de B
c

Figura 12.2 Um exemplo das RICs com herança simples.


• A herança múltipla complica a
implementação da vinculação dinâmica

C herda a e init() de A

C redefine fun() de A
C herda b e sum() de B
C define c e dud()
Aqui está incluída a
visão para A e C

vtable de C para (parte de C e A)

ponteiro para vtable código para init de A


Parte de C e A
a código para fun de C
Registro de
instância de ponteiro para vtable código para dud de C
classe para C Parte de B
b vtable de C para (parte de B)

c código para sum de B


Dados de C

Figura 12.3 Um exemplo de um RIC de uma subclasse com múltiplos pais.


Aqui está incluída apenas a
visão para B, pois A já foi
contemplada na outra vtable

• Devem existir ao menos duas visões diferentes disponíveis no RIC,


uma para cada classe mãe
Referências

Você também pode gostar