<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?action=history&amp;feed=atom&amp;title=Programa%C3%A7%C3%A3o_com_Objectos%2FTeste_de_2010%2F01%2F21</id>
	<title>Programação com Objectos/Teste de 2010/01/21 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?action=history&amp;feed=atom&amp;title=Programa%C3%A7%C3%A3o_com_Objectos%2FTeste_de_2010%2F01%2F21"/>
	<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&amp;action=history"/>
	<updated>2026-05-10T14:53:00Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&amp;diff=10960&amp;oldid=prev</id>
		<title>Root: Redirected page to ist:Programação com Objectos/Teste de 2010/01/21</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&amp;diff=10960&amp;oldid=prev"/>
		<updated>2018-11-07T17:32:35Z</updated>

		<summary type="html">&lt;p&gt;Redirected page to &lt;a href=&quot;https://web.tecnico.ulisboa.pt/~david.matos/w/pt/index.php/Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&quot; class=&quot;extiw&quot; title=&quot;ist:Programação com Objectos/Teste de 2010/01/21&quot;&gt;ist:Programação com Objectos/Teste de 2010/01/21&lt;/a&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&amp;amp;diff=10960&amp;amp;oldid=5006&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&amp;diff=5006&amp;oldid=prev</id>
		<title>Root: moved Programação com Objectos - Teste de 2010/01/21 to Programação com Objectos/Teste de 2010/01/21</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&amp;diff=5006&amp;oldid=prev"/>
		<updated>2013-11-18T13:25:07Z</updated>

		<summary type="html">&lt;p&gt;moved &lt;a href=&quot;/~david/w/pt/Programa%C3%A7%C3%A3o_com_Objectos_-_Teste_de_2010/01/21&quot; class=&quot;mw-redirect&quot; title=&quot;Programação com Objectos - Teste de 2010/01/21&quot;&gt;Programação com Objectos - Teste de 2010/01/21&lt;/a&gt; to &lt;a href=&quot;/~david/w/pt/Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&quot; class=&quot;mw-redirect&quot; title=&quot;Programação com Objectos/Teste de 2010/01/21&quot;&gt;Programação com Objectos/Teste de 2010/01/21&lt;/a&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:25, 18 November 2013&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&amp;diff=4892&amp;oldid=prev</id>
		<title>Root at 18:56, 4 November 2013</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&amp;diff=4892&amp;oldid=prev"/>
		<updated>2013-11-04T18:56:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:56, 4 November 2013&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l38&quot;&gt;Line 38:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 38:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#é um tipo primitivo&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#é um tipo primitivo&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''1.6.''' Em Java, o parâmetro E em java.util.Iterable&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;E&amp;gt;&lt;/del&gt;...&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''1.6.''' Em Java, o parâmetro E em java.util.Iterable...&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#é uma constante que especifica o limite superior para a iteração&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#é uma constante que especifica o limite superior para a iteração&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#é utilizado para definir o passo de iteração (i.e., quantos elementos se deve saltar – por omissão, é 1)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#é utilizado para definir o passo de iteração (i.e., quantos elementos se deve saltar – por omissão, é 1)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#permite especificar o tipo do comparador de elementos (instância referida por java.util.Comparator&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;E&amp;gt;&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#permite especificar o tipo do comparador de elementos (instância referida por java.util.Comparator)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#define tipo retornado pelo iterador correspondente&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#define tipo retornado pelo iterador correspondente&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#não deve ser usado&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#não deve ser usado&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l182&quot;&gt;Line 182:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 182:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;é um tipo primitivo&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;é um tipo primitivo&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''1.6.''' Em Java, o parâmetro E em java.util.Iterable&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;E&amp;gt;&lt;/del&gt;...&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''1.6.''' Em Java, o parâmetro E em java.util.Iterable...&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;é uma constante que especifica o limite superior para a iteração&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;é uma constante que especifica o limite superior para a iteração&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;é utilizado para definir o passo de iteração (i.e., quantos elementos se deve saltar – por omissão, é 1)&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;é utilizado para definir o passo de iteração (i.e., quantos elementos se deve saltar – por omissão, é 1)&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;permite especificar o tipo do comparador de elementos (instância referida por java.util.Comparator&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;E&amp;gt;&lt;/del&gt;)&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;permite especificar o tipo do comparador de elementos (instância referida por java.util.Comparator)&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#define tipo retornado pelo iterador correspondente&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#define tipo retornado pelo iterador correspondente&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;não deve ser usado&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:#&amp;lt;s&amp;gt;não deve ser usado&amp;lt;/s&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&amp;diff=3465&amp;oldid=prev</id>
		<title>Root: New page: {{TOCright}} == Parte 1 (resposta múltipla) ==   Figura 1 '''1.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes ...</title>
		<link rel="alternate" type="text/html" href="https://www.hlt.inesc-id.pt/~david/wiki/pt/index.php?title=Programa%C3%A7%C3%A3o_com_Objectos/Teste_de_2010/01/21&amp;diff=3465&amp;oldid=prev"/>
		<updated>2010-01-21T12:28:22Z</updated>

		<summary type="html">&lt;p&gt;New page: {{TOCright}} == Parte 1 (resposta múltipla) ==  &lt;a href=&quot;/~david/w/pt/File:UML-teste-po-20100121.png&quot; title=&quot;File:UML-teste-po-20100121.png&quot;&gt;frame|right| Figura 1&lt;/a&gt; &amp;#039;&amp;#039;&amp;#039;1.1.&amp;#039;&amp;#039;&amp;#039; Considere o diagrama UML da figura 1 (à direita). Qual das seguintes ...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{TOCright}}&lt;br /&gt;
== Parte 1 (resposta múltipla) ==&lt;br /&gt;
&lt;br /&gt;
[[Image:UML-teste-po-20100121.png|frame|right| Figura 1]]&lt;br /&gt;
'''1.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?&lt;br /&gt;
:#doThat (definido em C) não pode ser chamado se o objecto for referenciado através do tipo B&lt;br /&gt;
:#B implementa I através de C&lt;br /&gt;
:#o método doIt pode ser invocado através de referências para C&lt;br /&gt;
:#os métodos de A não podem ser invocados sobre instâncias de C&lt;br /&gt;
:#A é uma classe derivada de B&lt;br /&gt;
&lt;br /&gt;
'''1.2.''' Como se designa a operação que permite que um tipo hierarquicamente superior seja usado para referir uma instância de um tipo dele derivado?&lt;br /&gt;
:#polimorfismo&lt;br /&gt;
:#herança&lt;br /&gt;
:#upcasting&lt;br /&gt;
:#downcasting&lt;br /&gt;
:#redefinição&lt;br /&gt;
&lt;br /&gt;
'''1.3.''' Em Java, qual das seguintes frases está incorrecta?&lt;br /&gt;
:#java.lang.Object pode referir qualquer objecto&lt;br /&gt;
:#uma classe anónima pode implementar uma interface&lt;br /&gt;
:#uma classe abstracta pode sempre definir construtores&lt;br /&gt;
:#java.util.Collection é uma especialização de java.util.Iterable&lt;br /&gt;
:#java.lang.Serializable declara os métodos que permitem escrever um objecto para um canal de saída&lt;br /&gt;
&lt;br /&gt;
'''1.4.''' Em Java, uma classe anónima...&lt;br /&gt;
:#apenas define assinaturas de métodos&lt;br /&gt;
:#pode ter membros não públicos&lt;br /&gt;
:#não pode ter membros privados&lt;br /&gt;
:#não pode ser instanciada&lt;br /&gt;
:#não pode implementar uma interface&lt;br /&gt;
&lt;br /&gt;
'''1.5.''' Em Java, a classe java.io.Reader...&lt;br /&gt;
:#permite ler objectos “serializados” (i.e., instâncias de classes que implementem java.io.Serializable)&lt;br /&gt;
:#permite ler caracteres (texto)&lt;br /&gt;
:#permite ler bytes (dados binários)&lt;br /&gt;
:#não pode ser utilizada como tipo de atributos de outras classes&lt;br /&gt;
:#é um tipo primitivo&lt;br /&gt;
&lt;br /&gt;
'''1.6.''' Em Java, o parâmetro E em java.util.Iterable&amp;lt;E&amp;gt;...&lt;br /&gt;
:#é uma constante que especifica o limite superior para a iteração&lt;br /&gt;
:#é utilizado para definir o passo de iteração (i.e., quantos elementos se deve saltar – por omissão, é 1)&lt;br /&gt;
:#permite especificar o tipo do comparador de elementos (instância referida por java.util.Comparator&amp;lt;E&amp;gt;)&lt;br /&gt;
:#define tipo retornado pelo iterador correspondente&lt;br /&gt;
:#não deve ser usado&lt;br /&gt;
&lt;br /&gt;
'''1.7.''' Relativamente à interface java.util.Iterator, qual das seguintes frases está correcta?&lt;br /&gt;
:#quando associado à interface de java.lang.Object, permite percorrer qualquer objecto&lt;br /&gt;
:#sendo uma interface para iteração, não pode ser implementada por qualquer classe&lt;br /&gt;
:#permite a definição de algoritmos abstractos baseados em iteração&lt;br /&gt;
:#só é relevante quando se usam instâncias referenciáveis por java.util.Collection&lt;br /&gt;
:#define a política de comparação de elementos de uma colecção&lt;br /&gt;
&lt;br /&gt;
'''1.8.''' O padrão de desenho State...&lt;br /&gt;
:#permite delegar comportamentos específicos em objectos que os encapsulam&lt;br /&gt;
:#permite adicionar responsabilidades a objectos individuais em tempo de execução&lt;br /&gt;
:#permite delegar comportamentos dependentes do estado de um objecto&lt;br /&gt;
:#permite gerir as dependências de outros objectos relativamente ao estado de um objecto&lt;br /&gt;
:#permite guardar o estado de um objecto num canal de saída, para posterior recuperação&lt;br /&gt;
&lt;br /&gt;
'''1.9.''' O padrão de desenho Template Method...&lt;br /&gt;
:#permite adicionar funcionalidade a um objecto sem alterar a sua interface&lt;br /&gt;
:#deve ser utilizado quando o uso do mecanismo de herança não for conveniente&lt;br /&gt;
:#permite ajustar a interface e o comportamento de um objecto&lt;br /&gt;
:#define uma operação a aplicar a uma estrutura de objectos&lt;br /&gt;
:#estabelece que uma classe defina um algoritmo cujas partes devem ser implementadas pela subclasses&lt;br /&gt;
&lt;br /&gt;
'''1.10.''' O padrão de desenho Observer...&lt;br /&gt;
:#representa uma operação a ser realizada sobre os elementos de uma estrutura de objectos&lt;br /&gt;
:#permite gerir as dependências de outros objectos relativamente ao estado de um objecto&lt;br /&gt;
:#permite abstrair o uso de grupos de objectos por uma aplicação&lt;br /&gt;
:#permite tratar famílias de objectos e seus grupos indiscriminadamente&lt;br /&gt;
:#permite que o comportamento de um objecto mude quando o seu estado muda&lt;br /&gt;
&lt;br /&gt;
== Parte 2 ==&lt;br /&gt;
&lt;br /&gt;
'''2.1.''' (1.5 val.) As classes paramétricas permitem uma forma de polimorfismo diferente do que é implicado pelo mecanismo de herança. Quais são as diferenças? Que vantagens estão associadas aos tipos paramétricos? Justifique e dê um exemplo.&lt;br /&gt;
&lt;br /&gt;
'''2.2.''' (1.5 val.) O padrão de desenho Visitor permite abstrair funcionalidade a aplicar a uma estrutura de objectos. Quais são as vantagens e inconvenientes associados ao uso deste padrão? Dê um exemplo de utilização, onde se evidenciem as vantagens. Considera que é equivalente ao uso do padrão de desenho Strategy? Justifique. &lt;br /&gt;
&lt;br /&gt;
'''2.3.''' (1.5 val.) Explique quais as vantagens decorrentes do uso do padrão Abstract Factory no desenho de aplicações. Em que medida é importante o polimorfismo nesta situação? Apresente um exemplo que ilustre a sua resposta.&lt;br /&gt;
&lt;br /&gt;
'''2.4.''' (1.0 val.) Considere o padrão de desenho Composite. Descreva a estrutura prevista pelo padrão, assim como o modo de funcionamento. Quais são as vantagens da sua utilização? Dê um exemplo.&lt;br /&gt;
&lt;br /&gt;
'''2.5.1.''' (1.0 val.) Qual o resultado que se obtém quando se executa o programa? (represente mudanças de linha com \n)&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public abstract class Ghost {&lt;br /&gt;
  public Ghost() { System.out.println(getClass().getName()); }&lt;br /&gt;
  public abstract void tick(Shell shell);&lt;br /&gt;
  public void tock(Shell shell) {}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class A extends Ghost {&lt;br /&gt;
  public void tick(Shell shell) { shell.use(new C()); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class B extends Ghost {&lt;br /&gt;
  public void tick(Shell shell) { shell.use(new A()); }&lt;br /&gt;
  public void tock(Shell shell) { shell.use(new A()); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class C extends Ghost {&lt;br /&gt;
  public void tick(Shell shell) { shell.use(new B()); }&lt;br /&gt;
  public void tock(Shell shell) { shell.use(new A()); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Shell {&lt;br /&gt;
  Ghost _ghost = new A();&lt;br /&gt;
  public void tick() { _ghost.tick(this); }&lt;br /&gt;
  public void tock() { _ghost.tock(this); }&lt;br /&gt;
  public void use(Ghost ghost) { _ghost = ghost; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class GhostInTheShell {&lt;br /&gt;
  public static void main(String args[]) {&lt;br /&gt;
    Shell shell = new Shell();&lt;br /&gt;
    shell.tick();&lt;br /&gt;
    //!2.7&lt;br /&gt;
    shell.tick(); shell.tock(); shell.tick();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.5.2.''' (0.5 val.) Que padrão de desenho é usado no programa?&lt;br /&gt;
&lt;br /&gt;
'''2.6.''' (2.5 val.) Desenhe o diagrama de classes UML correspondente ao seguinte problema:&lt;br /&gt;
&lt;br /&gt;
Uma empresa especializou-se no fabrico de máquinas de lavar roupa e de máquinas de lavar loiça. A gestão é moderna, sendo as tarefas normalmente executadas pelos gestores (contratar funcionários, por exemplo) e distribuídas por todos os funcionários de forma rotativa. O conselho de gestão tem sempre um operário e um engenheiro.&lt;br /&gt;
&lt;br /&gt;
As máquinas de lavar roupa desta empresa caracterizam-se pela sua segurança, por forma a evitar acidentes com crianças. A máquina de lavar roupa tem os seguintes botões e sensores: botão “ligar/desligar” (evento “press” chama o método “power”); botão “abrir porta” (evento “press” chama método “open”); sensor “porta fechada” (evento “trigger” chama método “closed”). A máquina tem ainda um temporizador, uma cuba rotativa e uma caixa metálica.&lt;br /&gt;
&lt;br /&gt;
As máquinas de lavar loiça são muito semelhantes no hardware, sendo a principal diferença a ausência da cuba rotativa.&lt;br /&gt;
&lt;br /&gt;
A empresa é caracterizada pelo seu capital social, pelo número de máquinas vendidas e pelo número de funcionários. Os funcionários são caracterizados pelo seu vencimento. As máquinas de lavar loiça pelo preço e peso. As máquinas de lavar roupa pelo preço, peso e pelo número de rotações da cuba (centrifugação).&lt;br /&gt;
&lt;br /&gt;
Represente as classes (seus nomes, métodos e atributos). Indique também as relações de herança, associação e agregação.&lt;br /&gt;
&lt;br /&gt;
'''2.7.''' (1.5 val.) Desenhe o diagrama de sequência UML correspondente à execução do programa da pergunta 2.5, incluindo as etapas de criação dos objectos (ignore as linhas do programa assinaladas com //!2.7). O diagrama de sequência deve conter os nomes das mensagens trocadas (não é necessário representar os argumentos dessas mensagens nem as de retorno).&lt;br /&gt;
&lt;br /&gt;
'''2.8.''' (2.0 val.) Uma agência de apoio humanitário organiza a sua actuação em função dos seus beneficiários: regiões, povoações e indivíduos (uma região contém povoações e as povoações contêm indivíduos). Cada tipo de beneficiário regista o nível de apoio recebido (um valor inteiro). Este valor é utilizado pela agência para determinar quais as regiões, as povoações, ou os indivíduos mais carenciados. A agência sabe que as condições/necessidades de ajuda variam com o período do ano e em função de catástrofes. Como tal, o processo de cálculo e actualização deve ser suficientemente flexível para poder ser alterado conforme as necessidades e deve ser independente dos beneficiários, para evitar introduzir mais complexidade nas suas vidas.&lt;br /&gt;
&lt;br /&gt;
Considerando o exposto acima, a agência define um calculador de benefícios (designado genericamente por Calculator). A implementação mais simples (designada por Standard) contabiliza: para cada indivíduo, uma unidade de ajuda; para cada povoação, o somatório das ajudas aos indivíduos que a habitam; e, para cada região, o somatório dos valores da ajuda dadas às povoações que contém. Existe ainda o calculador para casos de catástrofe (designado por Emergency), que difere do Standard por contabilizar menos ajuda (apenas 75% do total) para povoações com mais de 100 indivíduos e menos ajuda (apenas 90% do total) para regiões com mais de 20 povoações.&lt;br /&gt;
&lt;br /&gt;
Implemente todos os conceitos. Considere que deve ser possível definir novas formas de cálculo sem necessitar alterar, nem os indivíduos, nem as povoações, nem as regiões.&lt;br /&gt;
&lt;br /&gt;
== Chave da Parte 1 ==&lt;br /&gt;
&lt;br /&gt;
[[Image:UML-teste-po-20100121.png|frame|right| Figura 1]]&lt;br /&gt;
'''1.1.''' Considere o diagrama UML da figura 1 (à direita). Qual das seguintes afirmações está correcta?&lt;br /&gt;
:#&amp;lt;s&amp;gt;doThat (definido em C) não pode ser chamado se o objecto for referenciado através do tipo B&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;B implementa I através de C&amp;lt;/s&amp;gt;&lt;br /&gt;
:#o método doIt pode ser invocado através de referências para C&lt;br /&gt;
:#&amp;lt;s&amp;gt;os métodos de A não podem ser invocados sobre instâncias de C&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;A é uma classe derivada de B&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.2.''' Como se designa a operação que permite que um tipo hierarquicamente superior seja usado para referir uma instância de um tipo dele derivado?&lt;br /&gt;
:#&amp;lt;s&amp;gt;polimorfismo&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;herança&amp;lt;/s&amp;gt;&lt;br /&gt;
:#upcasting&lt;br /&gt;
:#&amp;lt;s&amp;gt;downcasting&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;redefinição&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.3.''' Em Java, qual das seguintes frases está incorrecta?&lt;br /&gt;
:#&amp;lt;s&amp;gt;java.lang.Object pode referir qualquer objecto&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;uma classe anónima pode implementar uma interface&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;uma classe abstracta pode sempre definir construtores&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;java.util.Collection é uma especialização de java.util.Iterable&amp;lt;/s&amp;gt;&lt;br /&gt;
:#java.lang.Serializable declara os métodos que permitem escrever um objecto para um canal de saída&lt;br /&gt;
&lt;br /&gt;
'''1.4.''' Em Java, uma classe anónima...&lt;br /&gt;
:#&amp;lt;s&amp;gt;apenas define assinaturas de métodos&amp;lt;/s&amp;gt;&lt;br /&gt;
:#pode ter membros não públicos&lt;br /&gt;
:#&amp;lt;s&amp;gt;não pode ter membros privados&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;não pode ser instanciada&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;não pode implementar uma interface&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.5.''' Em Java, a classe java.io.Reader...&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite ler objectos “serializados” (i.e., instâncias de classes que implementem java.io.Serializable)&amp;lt;/s&amp;gt;&lt;br /&gt;
:#permite ler caracteres (texto)&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite ler bytes (dados binários)&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;não pode ser utilizada como tipo de atributos de outras classes&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;é um tipo primitivo&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.6.''' Em Java, o parâmetro E em java.util.Iterable&amp;lt;E&amp;gt;...&lt;br /&gt;
:#&amp;lt;s&amp;gt;é uma constante que especifica o limite superior para a iteração&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;é utilizado para definir o passo de iteração (i.e., quantos elementos se deve saltar – por omissão, é 1)&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite especificar o tipo do comparador de elementos (instância referida por java.util.Comparator&amp;lt;E&amp;gt;)&amp;lt;/s&amp;gt;&lt;br /&gt;
:#define tipo retornado pelo iterador correspondente&lt;br /&gt;
:#&amp;lt;s&amp;gt;não deve ser usado&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.7.''' Relativamente à interface java.util.Iterator, qual das seguintes frases está correcta?&lt;br /&gt;
:#&amp;lt;s&amp;gt;quando associado à interface de java.lang.Object, permite percorrer qualquer objecto&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;sendo uma interface para iteração, não pode ser implementada por qualquer classe&amp;lt;/s&amp;gt;&lt;br /&gt;
:#permite a definição de algoritmos abstractos baseados em iteração&lt;br /&gt;
:#&amp;lt;s&amp;gt;só é relevante quando se usam instâncias referenciáveis por java.util.Collection&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;define a política de comparação de elementos de uma colecção&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.8.''' O padrão de desenho State...&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite delegar comportamentos específicos em objectos que os encapsulam&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite adicionar responsabilidades a objectos individuais em tempo de execução&amp;lt;/s&amp;gt;&lt;br /&gt;
:#permite delegar comportamentos dependentes do estado de um objecto&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite gerir as dependências de outros objectos relativamente ao estado de um objecto&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite guardar o estado de um objecto num canal de saída, para posterior recuperação&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''1.9.''' O padrão de desenho Template Method...&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite adicionar funcionalidade a um objecto sem alterar a sua interface&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;deve ser utilizado quando o uso do mecanismo de herança não for conveniente&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite ajustar a interface e o comportamento de um objecto&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;define uma operação a aplicar a uma estrutura de objectos&amp;lt;/s&amp;gt;&lt;br /&gt;
:#estabelece que uma classe defina um algoritmo cujas partes devem ser implementadas pela subclasses&lt;br /&gt;
&lt;br /&gt;
'''1.10.''' O padrão de desenho Observer...&lt;br /&gt;
:#&amp;lt;s&amp;gt;representa uma operação a ser realizada sobre os elementos de uma estrutura de objectos&amp;lt;/s&amp;gt;&lt;br /&gt;
:#permite gerir as dependências de outros objectos relativamente ao estado de um objecto&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite abstrair o uso de grupos de objectos por uma aplicação&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite tratar famílias de objectos e seus grupos indiscriminadamente&amp;lt;/s&amp;gt;&lt;br /&gt;
:#&amp;lt;s&amp;gt;permite que o comportamento de um objecto mude quando o seu estado muda&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resolução da Parte 2 ==&lt;br /&gt;
&lt;br /&gt;
===2.1. Classes Paramétricas e Polimorfismo  ===&lt;br /&gt;
&lt;br /&gt;
Aspectos importantes:&lt;br /&gt;
* Definição de uma classe estruturalmente independente do(s) tipo(s) manipulado(s) (os seus parâmetros).&lt;br /&gt;
* O polimorfismo implicado pelas relações de herança (inclusão) permite o uso de uma instância de uma subclasse onde se espera uma de uma superclasse. O polimorfismo paramétrico permite a definição de classes concretas que manipulam qualquer tipo (potencialmente com restrições), evitando a definição de relações de herança (dependência) relativamente a um tipo determinado (introduz restrições desnecessárias). Note-se que uma classe paramétrica pode participar em relações de herança/implementação e ser usada polimorficamente (inclusão) como qualquer outra (e.g., List&amp;lt;A&amp;gt; e ArrayList&amp;lt;A&amp;gt;). No entanto, casos como  ArrayList&amp;lt;Animal&amp;gt; e ArrayList&amp;lt;Gato&amp;gt; não estão relacionadas polimorficamente.&lt;br /&gt;
&lt;br /&gt;
===2.2. Visitor &amp;amp; Strategy  ===&lt;br /&gt;
&lt;br /&gt;
Aspectos importantes:&lt;br /&gt;
* Descrição da estrutura e funcionamento do Visitor&lt;br /&gt;
* Vantagens e inconvenientes&lt;br /&gt;
* Exemplos: geração de código num compilador a partir de uma árvore sintáctica; desenho de uma cena a partir de uma descrição abstracta; cálculo de impostos sobre uma estrutura composta. Em geral, situações em que uma operação a realizar sobre uma estrutura de objectos e suas folhas possa ser generalizada.&lt;br /&gt;
* Visitor vs. Strategy: embora ambos os padrões permitam encapsular algoritmos a realizar sobre estruturas &amp;quot;clientes&amp;quot;, tanto a estrutura como o modo de funcionamento são diferentes. No Strategy, apesar de ser possível definir múltiplas versões de um algoritmo, não é possível especializar a operação dependendo do tipo específico do objecto.&lt;br /&gt;
&lt;br /&gt;
===2.3. Abstract Factory ===&lt;br /&gt;
&lt;br /&gt;
Aspectos importantes:&lt;br /&gt;
* Descrição da estrutura e funcionamento do Abstract Factory&lt;br /&gt;
* Abstract Factory utiliza polimorfismo para permitir o intercâmbio de fábricas sem ser necessário alterar a aplicação cliente&lt;br /&gt;
* Exemplo: escola com professores, salas, alunos, etc.: a estrutura da escola é sempre a mesma, mas a parametrização definida pela fábrica altera o funcionamento (por produzir intervenientes diferentes)&lt;br /&gt;
&lt;br /&gt;
===2.4. Composite ===&lt;br /&gt;
&lt;br /&gt;
Aspectos importantes:&lt;br /&gt;
* Estrutura: uma superclasse define o conceito abstracto a manipular. As subclasses, tanto atómicas, como as composições de componentes, são tratadas indistintamente e apresentam a mesma interface. O processamento de uma composição faz-se pelo processamento iterativo dos seus elementos.&lt;br /&gt;
* Exemplo: Rebanhos e Ovelhas (relativamente, por exemplo, à operação tosquiar).&lt;br /&gt;
&lt;br /&gt;
===2.5.1. Saída do programa===&lt;br /&gt;
 A\nC\nB\nA\nC\n&lt;br /&gt;
&lt;br /&gt;
===2.5.2. Identificação do padrão de desenho utilizado===&lt;br /&gt;
&lt;br /&gt;
O padrão utilizado é o State (Ghost).&lt;br /&gt;
&lt;br /&gt;
===2.6. Diagrama de classes (UML) ===&lt;br /&gt;
&lt;br /&gt;
Esboço do diagrama de classes para o problema apresentado.&lt;br /&gt;
&lt;br /&gt;
[[Image:PO-20100121-class.png]]&lt;br /&gt;
&lt;br /&gt;
===2.7. Diagrama de sequência (UML)===&lt;br /&gt;
&lt;br /&gt;
Note-se que alguns objectos não indicam variáveis associadas (os resultados da criação desses objectos são imediatamente passados como argumentos de outros métodos).&lt;br /&gt;
&lt;br /&gt;
[[Image:PO-20100121-seq.png]]&lt;br /&gt;
&lt;br /&gt;
===2.8. Exercício de programação (Apoio Humanitário) ===&lt;br /&gt;
&lt;br /&gt;
Usa-se o padrão Visitor como forma de abstrair o cálculo da ajuda prestada.&lt;br /&gt;
&lt;br /&gt;
Definem-se quatro conceitos: o beneficiário abstracto (HelpTarget), e cada um dos concretos (Person, Village, Region).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Basic help target.&lt;br /&gt;
 */&lt;br /&gt;
public abstract class HelpTarget {&lt;br /&gt;
        /**&lt;br /&gt;
         * No actual value is returned in this case.&lt;br /&gt;
         *&lt;br /&gt;
         * @param calculator the visitor used to evaluate assistance.&lt;br /&gt;
         * @return help received by this target.&lt;br /&gt;
         */&lt;br /&gt;
        public double accept(Calculator calculator) { throw new UnsupportedOperationException(); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Individual.&lt;br /&gt;
 * We omitted the initialisation code.&lt;br /&gt;
 */&lt;br /&gt;
public class Person extends HelpTarget {&lt;br /&gt;
        /**&lt;br /&gt;
         * @see HelpTarget#accept(Calculator)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double accept(Calculator calculator) { return calculator.evalPerson(this); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A village has villagers (persons).&lt;br /&gt;
 * We omitted the initialisation code.&lt;br /&gt;
 */&lt;br /&gt;
public class Village extends HelpTarget {&lt;br /&gt;
        /**&lt;br /&gt;
         * The villagers in this village.&lt;br /&gt;
         */&lt;br /&gt;
        private ArrayList&amp;lt;Person&amp;gt; _villagers = new ArrayList&amp;lt;Person&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Simple constructor for initialising the village with some villagers.&lt;br /&gt;
         */&lt;br /&gt;
        public Village() {&lt;br /&gt;
                int count = (int) (Math.random() * 100);&lt;br /&gt;
                for (int i = 0; i &amp;lt; count; i++) _villagers.add(new Person());&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @return size of village (number of villagers).&lt;br /&gt;
         */&lt;br /&gt;
        public int size() { return _villagers.size(); }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @param index&lt;br /&gt;
         * @return a villager&lt;br /&gt;
         */&lt;br /&gt;
        public Person getVillager(int index) { return _villagers.get(index); }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see HelpTarget#accept(Calculator)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double accept(Calculator calculator) { return calculator.evalVillage(this); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A region has villages.&lt;br /&gt;
 * We omitted the initialisation code.&lt;br /&gt;
 */&lt;br /&gt;
public class Region extends HelpTarget {&lt;br /&gt;
        /**&lt;br /&gt;
         * The villages in this region.&lt;br /&gt;
         */&lt;br /&gt;
        private ArrayList&amp;lt;Village&amp;gt; _villages = new ArrayList&amp;lt;Village&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Simple constructor for initialising the region with some villages.&lt;br /&gt;
         */&lt;br /&gt;
        public Region() {&lt;br /&gt;
                int count = (int) (Math.random() * 100);&lt;br /&gt;
                for (int i = 0; i &amp;lt; count; i++) _villages.add(new Village());&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @return size of region (number of villages).&lt;br /&gt;
         */&lt;br /&gt;
        public int size() {return _villages.size(); }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @param index&lt;br /&gt;
         * @return a village&lt;br /&gt;
         */&lt;br /&gt;
        public Village getVillage(int index) { return _villages.get(index); }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see HelpTarget#accept(Calculator)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double accept(Calculator calculator) { return calculator.evalRegion(this); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A classe Calculator define a interface de cálculo para cada conceito.&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * The Calculator visitor interface.&lt;br /&gt;
 */&lt;br /&gt;
public abstract class Calculator {&lt;br /&gt;
        /**&lt;br /&gt;
         * @param person&lt;br /&gt;
         * @return help received by this person.&lt;br /&gt;
         */&lt;br /&gt;
        public abstract double evalPerson(Person person);&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @param village&lt;br /&gt;
         * @return help received by this village.&lt;br /&gt;
         */&lt;br /&gt;
        public abstract double evalVillage(Village village);&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @param region&lt;br /&gt;
         * @return help received by this region.&lt;br /&gt;
         */&lt;br /&gt;
        public abstract double evalRegion(Region region);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O processo de cálculo simples é definido pela classe Standard.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;quot;Standard&amp;quot; help calculator.&lt;br /&gt;
 */&lt;br /&gt;
public class Standard extends Calculator {&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalVillage(Village)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalVillage(Village village) {&lt;br /&gt;
                double tax = 0;&lt;br /&gt;
                for (int index = 0; index &amp;lt; village.size(); index++)&lt;br /&gt;
                        tax += village.getVillager(index).accept(this);&lt;br /&gt;
                return tax;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalPerson(Person)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalPerson(Person person) {&lt;br /&gt;
                return 1;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalRegion(Region)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalRegion(Region region) {&lt;br /&gt;
                double tax = 0;&lt;br /&gt;
                for (int index = 0; index &amp;lt; region.size(); index++)&lt;br /&gt;
                        tax += region.getVillage(index).accept(this);&lt;br /&gt;
                return tax;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O processo de cálculo para emergências é definido pela classe Emergency.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * The emergency help system.&lt;br /&gt;
 */&lt;br /&gt;
public class Emergency extends Calculator {&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * High-water marker for region occupation.&lt;br /&gt;
         */&lt;br /&gt;
        private final int REGION_MAX = 20;&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * High-water marker for population.&lt;br /&gt;
         */&lt;br /&gt;
        private final int VILLAGE_MAX = 100;&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalVillage(Village)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalVillage(Village village) {&lt;br /&gt;
                double help = 0;&lt;br /&gt;
                for (int index = 0; index &amp;lt; village.size(); index++)&lt;br /&gt;
                        help += village.getVillager(index).accept(this);&lt;br /&gt;
                if (village.size() &amp;gt; VILLAGE_MAX) help *= .75;&lt;br /&gt;
                return help;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalPerson(Person)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalPerson(Person person) { return 1; }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * @see Calculator#evalRegion(Region)&lt;br /&gt;
         */&lt;br /&gt;
        @Override&lt;br /&gt;
        public double evalRegion(Region region) {&lt;br /&gt;
                double help = 0;&lt;br /&gt;
                for (int index = 0; index &amp;lt; region.size(); index++)&lt;br /&gt;
                        help += region.getVillage(index).accept(this);&lt;br /&gt;
                if (region.size() &amp;gt; REGION_MAX) help *= .9;&lt;br /&gt;
                return help;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simple aoolication.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public class App {&lt;br /&gt;
        /**&lt;br /&gt;
         * @param args&lt;br /&gt;
         */&lt;br /&gt;
        public static void main(String[] args) {&lt;br /&gt;
                HelpTarget v1 = new Village();&lt;br /&gt;
                HelpTarget r1 = new Region();&lt;br /&gt;
                HelpTarget p1 = new Person();&lt;br /&gt;
 &lt;br /&gt;
                Calculator sh = new Standard();&lt;br /&gt;
                Calculator eh = new Emergency();&lt;br /&gt;
 &lt;br /&gt;
                System.out.println(&amp;quot;Village help (standard): &amp;quot; + v1.accept(sh));&lt;br /&gt;
                System.out.println(&amp;quot;Region taxes (standard): &amp;quot; + r1.accept(sh));&lt;br /&gt;
                System.out.println(&amp;quot;Person taxes (standard): &amp;quot; + p1.accept(sh));&lt;br /&gt;
                System.out.println(&amp;quot;Village taxes (emergency): &amp;quot; + v1.accept(eh));&lt;br /&gt;
                System.out.println(&amp;quot;Region taxes (emergency): &amp;quot; + r1.accept(eh));&lt;br /&gt;
                System.out.println(&amp;quot;Person taxes (emergency): &amp;quot; + p1.accept(eh));&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category:PO]]&lt;br /&gt;
[[category:Ensino]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
</feed>