Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # # # # # # # # # # # # # #
- # Linguagens de Programação #
- # Prof. Fernando Pereira #
- # notasdogarcia.blog.com #
- # # # # # # # # # # # # # #
- Hoje vamos falar de orientação à objetos.
- O que é orientação a objetos?
- Quando dizemos que uma implementação é orientada a objetos, queremos dizer que os tipos são inteligentes, eles sabem realizar ações sobre sí mesmos.
- Ou seja, a orientação a objetos quer dizer que dado o objeto C eu tenho um conjunto de operações sobre ele, que estão aninhadas dentro da própria estrutura.
- ex: c.imprimaValor();
- Assim se em um programa eu não associar o código das ações relativas ao objeto X ao objeto sí propriamente dito, a programação não é orientada a objetos.
- // Nota em python o primeiro parametro de um metodo definido em uma classe recebera uma instanciação da classe como parâmetro.
- Porque isso é interessante?
- Para minimizar o custo de modificação de um programa.
- Já que de fato, a interface de um programa muda pouco, porém a implementação muda frequentemente.
- E pode precisar de edição com mais frequencia.
- // Smalltalk foi a linguagem que popularizou o termo "orientação a objetos"
- // Simula 67 foi a linguagem que primeiramente surgiu com a idéia "orientação a objetos" e com a idéia de "classe" e "herança"
- // Simula 1 era originalmente uma linguagem extremamente semelhante a fortran.
- // Os dois noruegueses que criaram Simula, morreram pouco depois de ganharem o premio turing, mas morreram antes da cerimonia.
- Linguagens orientadas a objetos:
- - C++, Java, Object Pascal, C# -> linguagens estáticas
- - Python, Ruby, PHP S.O, Smalltalk -> linguagens dinâmicas
- - Lua, JavaScript (Self) -> não possuem classes
- Caracteristicas em comum:
- C - Objetos
- - Classes +-
- - Herança, Delegação +-
- C - Subtipagem
- C - Todas usam muito o HEAP
- - Coletor de lixo. (C++ é o único que não possuí um)
- C - Reflexão (pode-se perguntar qual o tipo ou a classe de um objeto)
- C - Invocação Dinâmica
- C - Menssagens
- CONCEITO:
- Objeto é um dado que existe em tempo de execução,
- mas é um dado inteligente, que consegue realizar operações.
- Eles tem estado, e tempo de vida.
- CONCEITO:
- Uma Classe é uma implementação de um TAD.
- // Mas existem outras implementações de TADs que não poderiam ser consideradas TADs então essa definição é insuficiente =P
- Uma classe é uma forma, pela qual se descreve o conjunto de dados contidos em um tipo, e de operações que operam sobre tal.
- Uma classe também pode ser pensada (como no caso de python) como uma tabela de dados, e de ponteiros para funções.
- Em java Script não se tem "classes" porque na verdade só se tem o conceito de "tabela".
- Ex: de classe em python:
- class Animal:
- "The base class of the whole object zoo."
- def init (self, name):
- sel.name = name
- def str (self):
- return self.name + " is an animal"
- def eat(self):
- print self.name + ", which is an animal, is eating."
- class Mammal(Animal): // o animal entre parenteses indica que essa classe extende animal.
- "Mammals are animals that know how to suck milk."
- // mammals = mamiferos =]
- def str(self):
- return self.name + " is a mammal"
- def suck(self):
- printf self.name + ", which is a mammal, is sucking milk."
- // Assim com o sistema de heranças cada sub-classe torna-se mais especializada, apesar de não perder qualidades.
- class Dog(Mammal):
- "Dogs are mammals that can bark, and bite when they eat."
- def str (self):
- return self.name + " is a dog"
- def bark(self):
- print self.name + " is barking rather loudly."
- def eat(self):
- print self. name + " barks when it eats."
- self.bark
- // ps: bark = latir
- def test0():
- a = Animal("Tigrinho")
- b = Mammal("Oncinha")
- c = Dog("Beduino")
- print a
- print b
- print c
- (quando voce chama a função print, por default a função buscada é a str)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Em java o método que se imprime quando se dá um System.out.println(a) é o método "toString"
- O professor mostrou o mesmo código que copiei acima a respeito de python, em java.
- E foi listando as diferenças, dos objetos de uma linguagem de tipagem dinâmica para uma de tipagem estática.
- O professor desenhou as tabelas de cada uma das tres classes e mostrou uma lista contendo todas as implementações de funções do código,
- e mostrou em seguida que cada elemento das tabelas aponta para uma implementação especifica de uma função.
- Então começou a discutir a possibilidade de se atribuir um mamifero a um objeto do tipo estatico animal.
- Mas eu não poderia atribuir esse animal ( Agora com um objeto do tipo mamifero ) a uma variável do tipo mamifero.
- Pois nessas atribuições o que é considerado é o tipo estático, e não o dinâmico.
- Ele mostrou também que se eu chamo um tipo estatico mamifero, e chamo o toString dele, a implementação que será chamada é a propria.
- Agora, se eu igualar esse objeto a um do tipo dog e realizar a mesma chamada, agora o tipo dinâmico é do tipo dog, e a mesma chamada
- chamara o toString do Dog.
- Qual a vantagem desse polimorfismo de implementação? (se é que eu posso falar isso)
- Uma das máximas de computação é que cada programa deve ser implementado sempre para a interface mais externa possível.
- Assim eu tenho uma caixa preta, extremamente versátil, que pode ser usada para várias funcionalidades, sem precisar-se
- editar a implementação da própria caixa preta.
- Assim eu posso ter por exemplo uma lista, que conterá cachorros, capivaras, planarias e outros animais, já que a lista é do tipo animal.
- É mais generico, é mais flexível.
- Cada animal irá comer, da forma que eles sabem.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- O professor chamou a atenção para a ordenação dos nomes de funções na tabela.
- Se x extend y então as funções de x que são herdadas de y tem na tabela o mesmo endereço relativo!
- Ou seja é fácil encontrar a implementação da função batata, em um objeto do tipo y, mesmo que o tipo dinâmico seja x.
- Então para encontrar uma função especifica, basta realizar duas derreferencias:
- uma para encontrar o objeto (ou seja a tabela).
- outra para encontrar o indice da função (ou seja a posição na tabela).
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- CONCEITO:
- Herança multipla é a caracteristica de uma classe extender mais de uma única outra classe.
- Onde isso seria útil? Suponha que voce quer a classe "Flier" de animais que voam.
- Essa classe poderia extender tanto mamiferos (morcego) quanto aves
- Porém em java isso não é possível.
- Agora suponha que eu queira chamar uma função que existe em ambas as classes pais.
- Em python por default usa-se a primeira implementação a ser extendida.
- em C++ se há 2 metodos iguais há erro de compilação.
- Exceto quando o caso é a respeito da função construtora, e nesse caso chama-se ambas as construtoras.
- Outra ambiguidade:
- Seja A extendido por B e C, e D extende B e C, e todos tem o metodo init, se eu chamo D.init() o que acontece?
- python sempre chama a primeira como já disse acima.
- A maioria das linguagens de tipagem estatica não permite a compilação nesse caso.
- Como identificar o tipo dinâmico de um objeto em python?
- if isinstance(a, Mammal):
- Na implementação isso é feito com um ponteiro para o nome da classe.
- // Fim da aula.
Advertisement
Add Comment
Please, Sign In to add comment