Discussion:
Relacionamento entre Classes usando composição
(too old to reply)
Ale
2006-03-07 19:21:27 UTC
Permalink
Blz pessoal ? Não estou conseguindo entender a relação entre essas classes.

Se eu tenho uma classe pessoa que não é abstrata, uma PessoaFisica e uma
PessoaJuridica que herdam da pessoa e tenho outras classes que se associam
com pessoa como fica o meu código.

Por exemplo: a classe pessoa tem os atributos, nome, endereço
a classe pessoaFisica extende de Pessoa e tem o atributo CPF
a classe pessoaJuridica extende de Pessoa e tem o atributo CNPJ
a classe cliente tem um atributo do tipo pessoa ?? Isso é certo ?? Ou é o
contrário pessoa tem um atributo Cliente ??

E como fica a implementação disso quando quero utilizar essas classes

tipo :

class testAPP {
Cliente meuCliente = new pessoaFisica() ??


}

Por favor me ajudem nisso ??

Obrigado,
Alessandro
Vanderson Pacheco
2006-03-08 03:44:27 UTC
Permalink
Quando estiver em dúvida com relação a relacionamentos, procure verificar se
esse relação é do tipo "é um", ou "tem um".

Por exemplo, vc tem a classe Pessoa e a classe PessoaFísica.

PessoaFísica "é uma" Pessoa, então a é relação de herança;
Cliente "é uma" PessoaFísica, então a relação tb é de herança;

A implementação ficaria, Cliente herda de PessoaFísica, ou seja

PessoaFisica = new Cliente();

Vale lembra que se possui Cliente Juridico vão existir duas classes de
clientes, uma que herda de PessoaFisica e outra que Herda de PessoaJuridica
Post by Ale
Blz pessoal ? Não estou conseguindo entender a relação entre essas classes.
Se eu tenho uma classe pessoa que não é abstrata, uma PessoaFisica e uma
PessoaJuridica que herdam da pessoa e tenho outras classes que se associam
com pessoa como fica o meu código.
Por exemplo: a classe pessoa tem os atributos, nome, endereço
a classe pessoaFisica extende de Pessoa e tem o atributo CPF
a classe pessoaJuridica extende de Pessoa e tem o atributo CNPJ
a classe cliente tem um atributo do tipo pessoa ?? Isso é certo ?? Ou é o
contrário pessoa tem um atributo Cliente ??
E como fica a implementação disso quando quero utilizar essas classes
class testAPP {
Cliente meuCliente = new pessoaFisica() ??
}
Por favor me ajudem nisso ??
Obrigado,
Alessandro
Rodrigo da Costa
2006-03-24 14:43:01 UTC
Permalink
Vamos considerar ainda um outro cenário:

Todas as operações de ClienteFisico e ClienteJuridico são semelhantes.
Somente um ou outro método são diferentes, como um "Salvar".

Você poderia usar polimorfismo da seguinte maneira:
A Classe Pessoa possui um método virtual chamado "GetType" e uma propriedade
chamada Tipo. O Método GetType retorna o conteúdo da propriedade Tipo. Na
implementação da PessoaFisica e PessoaJuridica, vc sobrescreve os métodos
GetType() para que eles preencham a propriedade Tipo com respectivamente
"PessoaFisica" e "PessoaJuridica".

Para finalizar, a classe Cliente possui uma propriedade "Pessoa" que recebe
uma Pessoa, um construtor que receba a pessoa é um método Salvar.
Repare que o objetivo é que usando o método salvar, possamos salvar o que
for no nosso cliente e na nossa pessoa, seja física ou jurídica.

Então teremos o seguinte código para o método Salvar:
public String Salvar()
{
String retorno = "";
switch (this.Pessoa.GetType().ToUpper())
{
case "PESSOAFISICA":
retorno = "Pessoa Física Salva";
break;
case "PESSOAJURIDICA":
retorno = "Pessoa Jurídica Salva";
break;
}
return retorno;
}

Agora pra testar se conseguimos distinguir se o objeto é pessoaFisica ou
pessoaJuridica em tempo de execução no seu form principal, coloque o seguinte
código:

PessoaFisica pessoa = new PessoaFisica();
Cliente cliente = new Cliente(pessoa);
MessageBox.Show(cliente.Salvar());

E você vai ver que cliente distinguiu que era uma pessoaFisica.

Qual é o objetivo disso?
Se você criar uma Classe ClienteFisico e ClienteJuridico, que salvo as
diferenças de CNPJ e CPF, realizam exatamente as mesmas operações, você
estará duplicando o código e o tornando difícil de gerenciar, principalmente
em caso de mudanças.
Como o código do cliente é exatamente o mesmo tanto para físico como
jurídico, através do GetType, as especificas operações diferentes entre os
dois tipos de pessoa pode ser diferenciado.

Claro que isso é só uma das inúmeras soluções para o problema.

Para fins de esclarecimento segue os códigos das classes:
public class Pessoa
{
public string Tipo;
public virtual String GetType()
{
return Tipo;
}
}
public class PessoaFisica : Pessoa
{
public override string GetType()
{
this.Tipo = "PessoaFisica";
return this.Tipo;
}
}
public class PessoaJuridica : Pessoa
{
public override string GetType()
{
this.Tipo = "PessoaJuridica";
return this.Tipo;
}
}
public class Cliente
{
private Pessoa _pessoa;

public Pessoa Pessoa
{
get { return _pessoa; }
set { _pessoa = value; }
}
public Cliente(Pessoa pessoa)
{
this.Pessoa = pessoa;
}
public String Salvar()
{
String retorno = "";
switch (this.Pessoa.GetType().ToUpper())
{
case "PESSOAFISICA":
retorno = "Pessoa Física Salva";
break;
case "PESSOAJURIDICA":
retorno = "Pessoa Jurídica Salva";
break;
}
return retorno;
}

}

Para finalizar, o Load do Formulário:
private void Form1_Load(object sender, EventArgs e)
{
PessoaFisica pessoa = new PessoaFisica();
Cliente cliente = new Cliente(pessoa);
MessageBox.Show(cliente.Salvar());
}

Loading...