<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sylverio &#187; UML</title>
	<atom:link href="http://sylverio.com.br/blog/category/uml/feed/" rel="self" type="application/rss+xml" />
	<link>http://sylverio.com.br/blog</link>
	<description>Análise, Arquitetura, Orientação a Objetos, UML, Tecnologias e Programação</description>
	<lastBuildDate>Mon, 06 Feb 2012 11:01:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Generalização Especialização Herança</title>
		<link>http://sylverio.com.br/blog/2009/01/generalizacao-especializacao-heranca/</link>
		<comments>http://sylverio.com.br/blog/2009/01/generalizacao-especializacao-heranca/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 12:59:18 +0000</pubDate>
		<dc:creator>Carlos Fernando Sylverio</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[O.O.]]></category>

		<guid isPermaLink="false">http://sylverio.com.br/blog/?p=46</guid>
		<description><![CDATA[Olá pessoal, estive de férias e passei um bom tempo sem escrever, mas agora descançado, não há mais desculpas. Fiz uma breve descrição sobre generalização, especialização e herança, devido a um pedido do último post e montei um pequena aplicação &#8230;<p class="read-more"><a href="http://sylverio.com.br/blog/2009/01/generalizacao-especializacao-heranca/">Saiba mais &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal, estive de férias e passei um bom tempo sem escrever, mas agora descançado, não há mais desculpas.</p>
<p>Fiz uma breve descrição sobre generalização, especialização e herança, devido a um pedido do último post e montei um pequena aplicação para exemplificar o assunto.</p>
<p><strong>Conceito</strong></p>
<p>Podemos dizer que <strong>generalização</strong> é o agrupamento de objetos ou elementos com características comuns em um modelo ou sistemas, é uma descrição mais geral sobre o objeto referente.</p>
<p>E a <strong>especialização</strong> é processo inverso, é a definição das particularidades de cada objeto ou elemento, são elementos mais consistentes que estendem o elemento genérico.</p>
<p>Dando continuidade ao exemplo citado no último post, casa, galpão, prédio, chamarei a generalização de &#8220;<a href="http://pt.wikipedia.org/wiki/Habita%C3%A7%C3%A3o" target="_blank">Habitação</a>&#8220;.</p>
<p><em>(achei que não foi uma boa escolha esses elementos, prédio, galpão, etc&#8230; Para falar de generalização, mas vou utilizá-los para não confundir quem está começando a ver O.O., e manter um pouco de compatibilidade com o post anterior)</em></p>
<p><img class="alignnone" title="Modelo generalização" src="http://www.sylverio.com.br/blog/image/29-01-09_generalizacao.JPG" alt="" width="273" height="202" /></p>
<p>Ou seja, todos os elementos, são habitações, porém cada elemento guarda sua característica particular.</p>
<p><strong>O que se ganha com isso?</strong></p>
<p>A utilização de generalização tem dois propósitos:</p>
<ul>
<li>Permitir que a classe base ou subclasse ser usada como variável. E regra é que uma     instância da subclasse possa ser usada quando a superclasse é declarada. Com isso possibilitamos a realização de operações polimórficas.</li>
<li>Permitir a incrementar as características de um elemento pelas características comuns de seu antecessor. Esta é a chamada de herança.</li>
</ul>
<p><strong>Herança</strong> é a definição da implementação da generalização no código</p>
<p>Já li em alguns livros que o conceito de generalização pode ser utilizada para agrupar características comuns de cada objeto, passando os atributos comuns para o objeto mais genérico. Mas eu discordo desta opinião.</p>
<p>Não há nenhuma vantagem criar um modelo utilizando generalização e especialização se não for para se aproveitar de um dos benefícios comentados acima.</p>
<p>Na verdade estaremos adicionando mais complexidade ao modelo e tornando o código menos escalável.</p>
<p><strong>Prática</strong></p>
<p>Criei um exemplo simples em C#.NET para mostrar como aplicar os conceitos acima.</p>
<p>Para isso no Visual Studio vá em File-&gt;New-&gt;Project.</p>
<p>Em Templates, escolha Console Application.</p>
<p>Altere o Name para Generalizacao e clique em OK</p>
<p><img class="alignnone" title="Solution Explorer" src="http://www.sylverio.com.br/blog/image/29-01-09-solution.jpg" alt="" width="363" height="189" /></p>
<p>Agora vá ao projeto (Generalizacao), clique com o botão direito vá em Add-&gt;New Item.</p>
<p>Em Templates, escolha Class.</p>
<p>Altere o Nome para Habitação.</p>
<p><img class="alignnone" title="Add New Item" src="http://www.sylverio.com.br/blog/image/29-01-09-new-item.jpg" alt="" width="683" height="420" /></p>
<p></p>
<p>Altere o código de para que fique da seguinte forma:</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> Generalizacao
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> abstract <span style="color: #6666cc; font-weight: bold;">class</span> Habitacao
    <span style="color: #008000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">/// &lt;summary&gt;</span>
        <span style="color: #008080; font-style: italic;">/// Quantidade de tomadas da habitação</span>
        <span style="color: #008080; font-style: italic;">/// &lt;/summary&gt;</span>
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">int</span> qtdTomada<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">/// &lt;summary&gt;</span>
        <span style="color: #008080; font-style: italic;">/// Obtem a quantidade de tomadas</span>
        <span style="color: #008080; font-style: italic;">/// &lt;/summary&gt;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> GetQtdTomada<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">return</span> qtdTomada<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">/// &lt;summary&gt;</span>
        <span style="color: #008080; font-style: italic;">/// Armazena a quantidade de tomada</span>
        <span style="color: #008080; font-style: italic;">/// &lt;/summary&gt;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> SetQtdTomada<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> value<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            qtdTomada <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p>Adiciona ao projeto as classes Casa, Predio e Galpao, e altere o código da seguinte forma:</p>
<p><em>Casa</em></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> Generalizacao
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Casa <span style="color: #008000;">:</span> Habitacao
    <span style="color: #008000;">&#123;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p><strong>Observação:</strong></p>
<p>Em C#, a sintaxe para herança é a utilização do comando: após o nome da classe seguindo do nome da classe a ser herdada.</p>
<p>Em Java, a sintaxe para herança é o comando extends após nome da classe seguindo do nome da classe a ser herdada.</p>
<p><em>Predio</em></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> Generalizacao
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Predio <span style="color: #008000;">:</span> Habitacao
    <span style="color: #008000;">&#123;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p><em>Galpao</em></p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> Generalizacao
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Galpao <span style="color: #008000;">:</span> Habitacao
    <span style="color: #008000;">&#123;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p>Pronto. Criamos a estrutura modelada em UML acima. </p>
<p>Agora nossa Solution deve ter a seguinte aparência.</p>
<p><img alt="" src="http://www.sylverio.com.br/blog/image/29-01-09-solution2.jpg" title="Solution Explorer" class="alignnone" width="252" height="213" /></p>
<p>Na classe Program.cs, escreva o seguinte código:</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> Generalizacao
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">// Instâncias de casa</span>
            Casa casa <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Casa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            casa<span style="color: #008000;">.</span><span style="color: #0000FF;">SetQtdTomada</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">15</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">// Instâncias de prédio</span>
            Predio predio <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Predio<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            predio<span style="color: #008000;">.</span><span style="color: #0000FF;">SetQtdTomada</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">300</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">// Instâncias de galpão</span>
            Galpao galpao <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Galpao<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            galpao<span style="color: #008000;">.</span><span style="color: #0000FF;">SetQtdTomada</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">40</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            ImprimirValorDeTomada<span style="color: #008000;">&#40;</span>casa, <span style="color: #666666;">&quot;Casa&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            ImprimirValorDeTomada<span style="color: #008000;">&#40;</span>predio, <span style="color: #666666;">&quot;Predio&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            ImprimirValorDeTomada<span style="color: #008000;">&#40;</span>galpao, <span style="color: #666666;">&quot;Galpao&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> ImprimirValorDeTomada<span style="color: #008000;">&#40;</span>Habitacao habitacao,<span style="color: #6666cc; font-weight: bold;">String</span> tipo<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;{0} tem a seguinte quantidade de tomadas: {1}&quot;</span>, tipo, habitacao<span style="color: #008000;">.</span><span style="color: #0000FF;">GetQtdTomada</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p>Como você deve ter observado, quando estava codificando, o seguinte acontecimento. O intellisense apresentar os métodos codificados na classe Habitação, para todas as subclasses.</p>
<p><img alt="" src="http://www.sylverio.com.br/blog/image/29-01-09-intelicense.jpg" title="Intelicense" class="alignnone" width="417" height="194" /></p>
<p>Isso é possível devido às classes Casa, Predio e Galpao herdarem da classe Habitação, ou seja, toda a classe que herda de Habitação terá sua característica e comportamento.</p>
<p>Outra coisa que podemos observar nesse exemplo é o método ImprimirValorDeTomada que recebe como parâmetro Habitação, porém é passado Casa, Predio e Galpao.<br />
Toda subclasse pode ser convertida no tipo da superclasse. Nesse método não importa qual é o tipo de habitação e sim se é do tipo habitação.</p>
<p><strong>Observação</strong></p>
<p>Toda subclasse pode ser convertida no tipo da superclasse, porém para o processo inverso é necessário a realização de cast.</p>
<p>Exemplo:</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">Casa casa1 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Casa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// conversão Implicit</span>
Habitacao hab <span style="color: #008000;">=</span> casa1<span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// conversão Explicit (Cast)</span>
Casa casa2 <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>Casa<span style="color: #008000;">&#41;</span>hab<span style="color: #008000;">;</span></pre></td></tr></table></div>

</p>
<p>Mas pra frente falarei mais sobre generalização.</p>
<h3>Posts Relacionados</h3>
<p> * <a href="http://sylverio.com.br/blog/2012/01/polimorfismo/">Polimorfismo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sylverio.com.br/blog/2009/01/generalizacao-especializacao-heranca/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

