COMO UTILIZAR PROPRIEDADES EM OUTRA CLASSE?

MRSILVA 26/12/2016 11:45:51
#470055
Olá.

Estou tentando utilizar propriedades de uma classe em outra classe mas não estou conseguindo, fiz varias pesquisas mas não consegui implementar.

Fiz um exemplo para ficar mais fácil o entendimento.

Criei uma classe produto e uma classe TipoProduto, na classe Produto criei uma propriedade do tipo TipoProduto. Preciso dentro de um formulário carregar a propriedade DescricaoTipo que é da classe TipoProduto, através da classe Produto, mas dá o seguinte erro: An unhandled exception of type [ô]System.NullReferenceException[ô] occurred in Teste.exe

Veja os códigos que utilizei:

Classe produto:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Teste
{
class Produto
{

public Produto()
{
TipoProduto TipoProduto = new TipoProduto();

}


private int _Id;

public int Id
{
get { return _Id; }
set { _Id = value; }
}

private string _descricao;

public string descricao
{
get { return _descricao; }
set { _descricao = value; }
}

private TipoProduto _descricaoTipo;

public TipoProduto descricaoTipo
{
get { return _descricaoTipo; }
set { _descricaoTipo = value; }
}

}


Classe TipoProduto:
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Teste
{
public class TipoProduto
{
private int _IdTipo;

public int IdTipo
{
get { return _IdTipo; }
set { _IdTipo = value; }
}

private string _descricaoTipo;

public string descricaotipo
{
get { return _descricaoTipo; }
set { _descricaoTipo = value; }
}

}
}


Código do formulario:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Teste
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

Produto pro = new Produto();
pro.Id = 1;
pro.descricao = [Ô]teste[Ô];
pro.descricaoTipo.descricaotipo = [Ô]teste[Ô]; // Aqui acontece o erro


}
}
}


é possível fazer isso?

Isso é uma boa pratica de programação a orientação a objetos? Ou devo criar uma unica classe do tipo produto contendo todas as informações necessárias? e fazer esse separação de produto e tipo de produto somente no banco de dados?

Desde já agradeço quem puder me orientar.
LAMPIAO 26/12/2016 13:11:24
#470057
Citação:

:
Olá.

Estou tentando utilizar propriedades de uma classe em outra classe mas não estou conseguindo, fiz varias pesquisas mas não consegui implementar.

Fiz um exemplo para ficar mais fácil o entendimento.

Criei uma classe produto e uma classe TipoProduto, na classe Produto criei uma propriedade do tipo TipoProduto. Preciso dentro de um formulário carregar a propriedade DescricaoTipo que é da classe TipoProduto, através da classe Produto, mas dá o seguinte erro: An unhandled exception of type [ô]System.NullReferenceException[ô] occurred in Teste.exe

Veja os códigos que utilizei:

Classe produto:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Teste
{
class Produto
{

public Produto()
{
TipoProduto TipoProduto = new TipoProduto();

}


private int _Id;

public int Id
{
get { return _Id; }
set { _Id = value; }
}

private string _descricao;

public string descricao
{
get { return _descricao; }
set { _descricao = value; }
}

private TipoProduto _descricaoTipo;

public TipoProduto descricaoTipo
{
get { return _descricaoTipo; }
set { _descricaoTipo = value; }
}

}


Classe TipoProduto:
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Teste
{
public class TipoProduto
{
private int _IdTipo;

public int IdTipo
{
get { return _IdTipo; }
set { _IdTipo = value; }
}

private string _descricaoTipo;

public string descricaotipo
{
get { return _descricaoTipo; }
set { _descricaoTipo = value; }
}

}
}


Código do formulario:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Teste
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

Produto pro = new Produto();
pro.Id = 1;
pro.descricao = [Ô]teste[Ô];
pro.descricaoTipo.descricaotipo = [Ô]teste[Ô]; // Aqui acontece o erro


}
}
}


é possível fazer isso?

Isso é uma boa pratica de programação a orientação a objetos? Ou devo criar uma unica classe do tipo produto contendo todas as informações necessárias? e fazer esse separação de produto e tipo de produto somente no banco de dados?

Desde já agradeço quem puder me orientar.




Olá MRSILVA, você deve inicializar o objeto TipoProduto, segue abaixo;

 Produto pro = new Produto();
pro.Id = 1;
pro.descricao = [Ô]teste[Ô];
pro.descricaoTipo = new TipoProduto {
descricaotipo = [Ô]teste[Ô]
}


Suas classes caso não vá utilizar bindings, podem ser simplificadas, por exemplo:

  public string descricaotipo { get; set; } 


Existem várias maneiras de implementar isso, essa que você postou é uma delas, só falatou inicializar o objeto.

Abraços
MRSILVA 26/12/2016 14:40:35
#470059
Muito obrigado Lampiao.

Deu certo!


Abraços.
GUIMORAES 26/12/2016 15:55:51
#470062
Resposta escolhida
Citação:

:
Olá.

Estou tentando utilizar propriedades de uma classe em outra classe mas não estou conseguindo, fiz varias pesquisas mas não consegui implementar.

Fiz um exemplo para ficar mais fácil o entendimento.

Criei uma classe produto e uma classe TipoProduto, na classe Produto criei uma propriedade do tipo TipoProduto. Preciso dentro de um formulário carregar a propriedade DescricaoTipo que é da classe TipoProduto, através da classe Produto, mas dá o seguinte erro: An unhandled exception of type [ô]System.NullReferenceException[ô] occurred in Teste.exe

Veja os códigos que utilizei:

Classe produto:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Teste
{
class Produto
{

public Produto()
{
TipoProduto TipoProduto = new TipoProduto();

}


private int _Id;

public int Id
{
get { return _Id; }
set { _Id = value; }
}

private string _descricao;

public string descricao
{
get { return _descricao; }
set { _descricao = value; }
}

private TipoProduto _descricaoTipo;

public TipoProduto descricaoTipo
{
get { return _descricaoTipo; }
set { _descricaoTipo = value; }
}

}


Classe TipoProduto:
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Teste
{
public class TipoProduto
{
private int _IdTipo;

public int IdTipo
{
get { return _IdTipo; }
set { _IdTipo = value; }
}

private string _descricaoTipo;

public string descricaotipo
{
get { return _descricaoTipo; }
set { _descricaoTipo = value; }
}

}
}


Código do formulario:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Teste
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

Produto pro = new Produto();
pro.Id = 1;
pro.descricao = [Ô]teste[Ô];
pro.descricaoTipo.descricaotipo = [Ô]teste[Ô]; // Aqui acontece o erro


}
}
}


é possível fazer isso?

Isso é uma boa pratica de programação a orientação a objetos? Ou devo criar uma unica classe do tipo produto contendo todas as informações necessárias? e fazer esse separação de produto e tipo de produto somente no banco de dados?

Desde já agradeço quem puder me orientar.



Como o LAMPIÃO já resolveu sua questão, queria só fazer um adendo a situação.

No seu construtor, você inicializou a Classe TipoProduto, mas instanciou como uma nova classe.

public Produto()
{
TipoProduto TipoProduto = new TipoProduto();

}


O correto seria fazer assim.

  

Public TipoProduto _tipoProduto {get;set;}

public Produto()
{
_tipoProduto = new TipoProduto();

}


Desta forma, você não precisa instanciar uma nova classe ao chamar a propriedade definida, como foi feito abaixo.

  Produto pro = new Produto();
pro.Id = 1;
pro.descricao = [Ô]teste[Ô];
pro.descricaoTipo = new TipoProduto {
descricaotipo = [Ô]teste[Ô]
}


MRSILVA 26/12/2016 17:26:21
#470067
Muito obrigado Guimoraes.

Se tivesse encerrado o tópico não tinha aprendido isso hoje.

Testei aqui deu certo.
Tópico encerrado , respostas não são mais permitidas