Programação Orientada por Objectos - Aula 3

2.826 visualizações

Publicada em

Aula teórica 3 da unidade (disciplina) de Programação Orientada por Objectivos para os cursos de LIGE, LEI e LETI no ISCTE-IUL no 2.º semestre do ano lectivo de 2009/2010.

Publicada em: Educação, Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
2.826
No SlideShare
0
A partir de incorporações
0
Número de incorporações
815
Ações
Compartilhamentos
0
Downloads
137
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Programação Orientada por Objectos - Aula 3

  1. 1. Aula 3<br />Interfaces<br />Listas e listas ligadas<br />Iteradores<br />
  2. 2. Na aula anterior<br />Polimorfismo de subtipos<br />Classes e operações polimórficas<br />Herança<br />Ligação estática e ligação dinâmica<br />Classes abstractas e classes concretas<br />Operações abstractas<br />Análise, desenho e implementação<br />Dicionário do domínio<br />Conceitos<br />Conceitos concretos e conceitos abstractos<br />2009/2010<br />Programação Orientada por Objectos<br />2<br />
  3. 3. Interfaces<br />Definem um comportamento que as classes podem implementar<br />Contêm apenas constantes e declarações de operações (e tipos embutidos)<br />Classes podem implementar interfaces<br />Uma classe pode implementar várias interfaces, embora possa derivar apenas de uma outra classe<br />Uma interface pode estender (derivar de) outra<br />2009/2010<br />Programação Orientada por Objectos<br />3<br />
  4. 4. Interfaces: definição<br />public interface Comparable<T> {<br />intcompareTo(T object);<br />}<br />public interface Queue<E> {<br /> E element();<br />voidadd(E e);<br />void remove();<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />4<br />Interface genérica. T é um parâmetro. O correspondente argumento tem de ser um tipo.<br />Nota: A interface Queue é um pouco diferente na biblioteca do Java!<br />Operações públicas por omissão.<br />Operações apenas declaradas. Não se define qualquer método. Não é necessário usar o qualificador abstract.<br />
  5. 5. Interfaces: implementação<br />public class Rational implements Comparable<Rational> {<br /> private int numerator;<br /> private int denominator;<br /> …<br /> public intcompareTo(final Rational another) {<br />intleftNumerator = <br />getNumerator() * another.getDenominator();<br />intrightNumerator = <br />another.getNumerator() * getDenominator();<br /> if (leftNumerator > rightNumerator)<br /> return 1;<br /> if (leftNumerator < rightNumerator)<br /> return -1;<br /> return 0;<br /> }<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />5<br />
  6. 6. public class Rational implements Comparable<Rational> {<br /> private int numerator;<br /> private int denominator;<br /> …<br /> public intcompareTo(final Rational another){<br /> return getNumerator() * another.getDenominator()<br /> - another.getNumerator() * getDenominator();<br /> }<br /> …<br />}<br />Interfaces: implementação<br />2009/2010<br />Programação OrientadaporObjectos<br />6<br />«interface»<br />Comparable<T->Rational><br />Implementação<br />Relação de realização<br />Comparable<T -> Rational><br />Rational<br />Rational<br />
  7. 7. Interfaces: polimorfismo<br />publicclassMyListimplementsQueue<Customer> {<br /> …<br />}<br />publicclassMyListTester {<br /> …<br />publicstaticvoidmain(final String[] arguments) {<br />Queue<Customer> customerQueue = <br />newMyList();<br /> … <br /> }<br /> … <br />}<br />2009/2010<br />Programação Orientada por Objectos<br />7<br />Queue<E -> Customer><br />MyList<br />
  8. 8. Interfaces: nomes<br />Adjectivo denotando possibilidade de realizar determinadas operações (e.g., Comparable)<br />Nome denotando conceito cujo comportamento será implementado (e.g., Queue)<br />2009/2010<br />Programação Orientada por Objectos<br />8<br />Caso semelhante ao das classes abstractas, mas<br />não há qualquer herança de implementação (i.e., de atributos não constantes e métodos) e<br />uma classe que implemente a interface pode simultaneamente implementar outras interfaces.<br />
  9. 9. Genericidade<br />Precisa-se de classes semelhantes<br />Com operações semelhantes<br />Com atributos semelhantes<br />Variando apenas em alguns tipos (e.g., o tipo dos elementos a guardar em diferentes listas)<br />É necessário definir essas classes separadamente?<br />2009/2010<br />Programação Orientada por Objectos<br />9<br />
  10. 10. Lista genérica?<br />public class ArrayList {<br /> private Object[] elements;<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />10<br />- elements<br />Object<br />ArrayList<br />*<br />Room<br />
  11. 11. Lista genérica: implementação<br />public class ArrayList<E> {<br /> private E[] elements;<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />11<br />Classe genérica. E é um parâmetro. O correspondente argumento tem de ser um tipo.<br />E<br />Notação UML para classes genéricas (também conhecidas por modelos ou templates).<br />ArrayList<br />- elements : E [*]<br />«bind» <E -> Room><br />- elements<br />ArrayList<E->Room><br />Room<br />*<br />
  12. 12. Lista genérica: utilização<br />publicclassFloor {<br />privateArrayList<Room> rooms =<br />newArrayList<Room>();<br />publicFloor(final intnumberOfRooms) {<br /> for (introomNumber = 1; <br />roomNumber != numberOfRooms + 1; <br />roomNumber++)<br />rooms.addFirst(newRoom(roomNumber));<br /> }<br />publicvoid show() {<br />while (rooms.hasNext())<br /> out.println(rooms.next());<br /> }<br />}<br />2009/2010<br />Programação OrientadaporObjectos<br />12<br />Inserir novo elemento no início ou a meio da lista implica “empurrar” elementos existentes para “fazer espaço”.<br />Para fazer isto o que é preciso?<br />
  13. 13. Lista ligada genérica: implementação<br />public class LinkedList<E> {<br /> Node<E> firstNode = null;<br /> Node<E> currentNode = null;<br /> …<br /> private static class Node<E> {<br /> private Node<E> nextNode;<br /> private E element;<br /> private Node(final Node<E> nextNode,<br /> final E element) {<br />this.nextNode = nextNode;<br />this.element = element;<br /> }<br /> }<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />13<br />Classe embutida (nested) privada. A classe LinkedList<E> tem acesso aos membros privados de Node<E>.<br />
  14. 14. Lista ligada genérica: notação<br />2009/2010<br />Programação Orientada por Objectos<br />14<br />E<br />E<br />LinkedList<br />LinkedList<br />- firstNode: Node<E><br />- currentNode: Node<E><br />E<br />Node<br />- nextNode: Node<br />- element: E<br />E<br />Notações para o embutimento.<br />Node<br />- nextNode: Node<br />- element: E<br />E<br />E<br />LinkedList<br />LinkedList::Node<br />- firstNode: Node<E><br />- currentNode: Node<E><br />- nextNode: Node<br />- element: E<br />
  15. 15. Lista ligada genérica: utilização<br />publicclassFloor {<br />privateLinkedList<Room> rooms =<br />newLinkedList<Room>();<br />publicFloor(final intnumberOfRooms) {<br /> for (introomNumber = 1; <br />roomNumber != numberOfRooms + 1; <br />roomNumber++)<br />rooms.addFirst(newRoom(roomNumber));<br /> }<br />publicvoid show() {<br />while (rooms.hasNext())<br /> out.println(rooms.next());<br /> }<br />}<br />2009/2010<br />Programação OrientadaporObjectos<br />15<br />Inserir novo elemento no início ou no meio da lista não implica “empurrar” elementos existentes!<br />
  16. 16. Lista ligada genérica: Exemplo<br />2009/2010<br />Programação Orientada por Objectos<br />16<br />rooms : LinkedList<E->Room><br />firstNode<br />currentNode<br />nextNode<br />: Node<E -> Room><br />: Node<E -> Room><br />nextNode = null<br />element<br />element<br />: Room<br />: Room<br />
  17. 17. Lista ligada genérica: inserir no início<br />public class LinkedList<E> {<br /> Node<E> firstNode = null;<br /> …<br /> private static class Node<E> {<br /> …<br /> private Node(final Node<E> nextNode,<br /> final E element) {<br />this.nextNode = nextNode;<br />this.element = element;<br /> }<br /> }<br /> public void addFirst(final E newElement) {<br />firstNode = new Node<E>(firstNode, newElement);<br /> }<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />17<br />
  18. 18. Lista ligada genérica: inserir no início<br />2009/2010<br />Programação Orientada por Objectos<br />18<br />rooms : LinkedList<E->Room><br />firstNode<br />firstNode<br />currentNode<br />nextNode<br />nextNode<br />: Node<E -> Room><br />: Node<E -> Room><br />: Node<E -> Room><br />nextNode = null<br />element<br />element<br />element<br />: Room<br />: Room<br />newElement : Room<br />
  19. 19. Lista ligada genérica: remover do início<br />public class LinkedList<E> {<br /> …<br /> public void removeFirst() {<br /> if (isEmpty())<br /> throw new NoSuchElementException(…);<br /> if (currentNode == firstNode)<br />currentNode = currentNode.nextNode;<br /> Node<E> nextFirstNode = firstNode.nextNode;<br />firstNode.element = null;<br />firstNode.nextNode = null;<br />firstNode = nextFirstNode; }<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />19<br />
  20. 20. Lista ligada genérica: remover do início<br />2009/2010<br />Programação Orientada por Objectos<br />20<br />rooms : LinkedList<E->Room><br />firstNode<br />currentNode<br />firstNode<br />nextNode<br />: Node<E -> Room><br />: Node<E -> Room><br />element = null<br />nextNode = null<br />element<br />element<br />: Room<br />: Room<br />nextFirstNode : «ref» Node<E -> Room><br />
  21. 21. Lista ligada genérica: inserir no fim<br />public class LinkedList<E> {<br /> …<br /> public void addLast(final E element) {<br /> if (firstNode == null)<br />firstNode = new Node<E>(null, element);<br /> else<br />lastNode().nextNode = new Node<E>(null, element);<br /> }<br /> private Node<E> lastNode() {<br /> Node<E> node = firstNode;<br /> while (node.nextNode != null)<br /> node = node.nextNode;<br /> return node;<br /> }<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />21<br />
  22. 22. Lista ligada genérica: inserir no fim<br />public class LinkedList<E> {<br /> …<br /> public void addLast(final E element) {<br /> if (firstNode == null)<br />firstNode = new Node<E>(null, element);<br /> else {<br /> Node<E> lastNode = firstNode;<br /> while (lastNode.nextNode != null)<br />lastNode = lastNode.nextNode;<br />lastNode.nextNode = new Node<E>(null, element);<br /> }<br /> }<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />22<br />
  23. 23. Lista ligada genérica: inserir no fim<br />2009/2010<br />Programação Orientada por Objectos<br />23<br />rooms : LinkedList<E->Room><br />firstNode<br />currentNode<br />nextNode<br />nextNode<br />: Node<E -> Room><br />: Node<E -> Room><br />: Node<E -> Room><br />nextNode = null<br />nextNode = null<br />element<br />element<br />element<br />: Room<br />: Room<br />newElement : Room<br />lastNode : «ref» Node<E -> Room><br />
  24. 24. Lista ligada genérica: passar ao seguinte<br />public class LinkedList<E> {<br /> …<br /> public E next() {<br /> if (!hasNext())<br /> throw new NoSuchElementException(“…");<br /> if (currentNode == null)<br />currentNode = firstNode;<br /> else<br />currentNode = currentNode.nextNode;<br /> return currentNode.element;<br /> }<br /> …<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />24<br />
  25. 25. Lista ligada genérica: passar ao seguinte<br />2009/2010<br />Programação Orientada por Objectos<br />25<br />rooms : LinkedList<E->Room><br />firstNode<br />currentNode<br />currentNode<br />nextNode<br />nextNode<br />: Node<E -> Room><br />: Node<E -> Room><br />: Node<E -> Room><br />nextNode = null<br />nextNode = null<br />element<br />element<br />element<br />: Room<br />: Room<br />newElement : Room<br />
  26. 26. Lista ligada genérica: notação<br />2009/2010<br />Programação Orientada por Objectos<br />26<br />1<br />E<br />LinkedList<br />Esta solução não permite percorrer a lista mais do que uma vez em paralelo!<br />0..1<br />0..1<br />0..1<br />currentNode<br />E<br />Node<br />0..1<br />firstNode<br />0..1<br />- element: E<br />*<br />nextNode<br />0..1<br />
  27. 27. Lista ligada genérica: iteradores<br />publicclassFloor {<br />privateLinkedList<Room> rooms =<br />newLinkedList<Room>();<br />publicFloor(final intnumberOfRooms) {<br /> for (introomNumber = 1; <br />roomNumber != numberOfRooms + 1; <br />roomNumber++)<br />rooms.add(newRoom(roomNumber));<br /> }<br />publicvoid show() {<br />while (rooms.hasNext())<br /> out.println(rooms.next());<br /> }<br />}<br />2009/2010<br />Programação OrientadaporObjectos<br />27<br />
  28. 28. Lista ligada genérica: iteradores<br />publicclassFloor {<br />privateLinkedList<Room> rooms =<br />newLinkedList<Room>();<br />publicFloor(final intnumberOfRooms) {<br /> for (introomNumber = 1; <br />roomNumber != numberOfRooms + 1; <br />roomNumber++)<br />rooms.add(newRoom(roomNumber));<br /> }<br />publicvoid show() {<br />LinkedList<Room>.Iterator i = rooms.iterator();<br />while(i.hasNext())<br /> out.println(i.next());<br /> }<br />}<br />2009/2010<br />Programação OrientadaporObjectos<br />28<br />
  29. 29. Lista ligada genérica: notação<br />2009/2010<br />Programação Orientada por Objectos<br />29<br />E<br />LinkedList<br />0..1<br />LinkedList.this<br />1<br />E<br />*<br />Node<br />Iterator é uma<br />classe interna (inner). As suas instâncias têm uma ligação implícita à instância da classe envolvente que as criou. A ver com pormenor mais tarde. <br />0..1<br />0..1<br />*<br />Iterator<br />currentNode<br />firstNode<br />0..1<br />Esta solução permite percorrer a lista mais do que uma vez em paralelo!<br />- element: E<br />*<br />0..1<br />nextNode<br />
  30. 30. Iteradores<br />Permitem iterar ao longo de uma sequência de elementos, actuando sobre essa sequência<br />A uma sequência podem associar-se vários iteradores<br />Classes que forneçam iteradores podem ser usadas em ciclos for-each<br />2009/2010<br />Programação Orientada por Objectos<br />30<br />Mais tarde voltaremos a este assunto.<br />
  31. 31. A reter…<br />Interfaces<br />Definem comportamentos (adjectivam)<br />Classes implementam-nas<br />Listas<br />Listas ligadas<br />Operações sobre listas ligadas<br />Introdução aos iteradores<br />2009/2010<br />Programação Orientada por Objectos<br />Página 31<br />
  32. 32. A ler para a próxima aula…<br />Classes relativas a colecções na API do Java<br />Capítulos 1 a 10 e 16 do livro:<br />Y. Daniel Liang, Introduction to Java Programming, 7.ª edição, Prentice-Hall, 2008.ISBN: 978-0-13-605966-0<br />2009/2010<br />Programação Orientada por Objectos<br />Página 32<br />
  33. 33. Aula 3: Sumário<br />Interfaces<br />Listas e listas ligadas<br />Iteradores<br />2009/2010<br />Programação Orientada por Objectos<br />Página 33<br />

×