8
respostas

Nao entendo este codigo

public partial class CadastroDeConta 
{
    private Form1 aplicacaoPrincipal;

    public CadastroDeConta(Form1 aplicacaoPrincipal) {
        this.aplicacaoPrincipal = aplicacaoPrincipal;
    }

    // Ação de cadastro de conta
}
8 respostas

Olá Janile. Poderia especificar exatamente qual parte do código você não entendeu?

Olá Janile,

o formulário principal e o formuĺário de cadastro de contas são objetos diferentes. Para que o segundo tenha acesso ao primeiro, é necessário que passemos a referência para o formulário principal na hora da construção do formulário de cadastro.

Veja se com esses nomes fica mais simples:

public partial class CadastroDeConta 
{
    private Form1 formularioPrincipal;

    public CadastroDeConta(Form1 referenciaRecebida) {
        this.formularioPrincipal = referenciaRecebida;
    }

    // Ação de cadastro de conta
}

O formulário principal é necessário para que possamos acessar seus atributos, por exemplo, o array de contas.

Esta correto o comentario que fiz?

public partial class CadastroDeConta 
{
    private Form1 formularioPrincipal; //estou colocando como atributo na classe CadastroDeConta o Form1?

//nao entendo o objetivo desse construtor! 
   public CadastroDeConta(Form1 referenciaRecebida) {
        this.formularioPrincipal = referenciaRecebida;
    }

    // Ação de cadastro de conta
}

Porque esta crianco um atributo formularioPrincipal do tipo Form1?

public partial class CadastroDeConta 
{
    private Form1 formularioPrincipal;

    public CadastroDeConta(Form1 referenciaRecebida) {
        this.formularioPrincipal = referenciaRecebida; // nao entendo esta linha de codigo!
    }

    // Ação de cadastro de conta
}

Desculpa a demora, Janile

Sim, o comentário está correto, com apenas uma ressalva. Lembre que a classe Form1 representa a receita do Form1. Ela pode receber qualquer instância de Form1, incluindo o Formulário Principal.

Lembre que cada um dos formulários é uma instância (objeto) de uma classe. Ou seja, assim como uma classe Cliente pode ter dentro dela um atributo do tipo Endereço, a classe CadastroDeConta pode ter um atributo do tipo Form1.

Dado que a sua classe tem um atributo do tipo Form1, ainda precisamos inicializá-lo. É isso que fazemos na linha na qual você tem dúvida. Ela inicializa o atributo para apontar para um objeto específico, que é o seu formulário principal.

Resumindo, esse atributo poderia apontar para qualquer instância de Form1, mas ele aponta para apenas uma, o seu objeto do formulário principal, que é do tipo Form1 e eu chamei de referenciaRecebida

Me avisa se algo não tiver ficado claro!

Acho que estou confundindo um pouco. Mas ainda nao entendo porque tenho que instanciar um objeto do tipo Form1, porque diretamente nao faco referencia ao Form1, já que é nele que coloquei todo o meu codigo?

Janile, toda vez que alguem for instanciar um objeto do tipo CadastroDeConta você irá precisar passar um Form1, dessa forma você está injetando uma dependência na classe CadastroDeConta, obrigando a ser passado um Form1 quem quiser instanciala-la, e no construtor ela guarda essa referência do objeto form1, em um atributo. Por exemplo :

CadastroDeConta cadastroDeConta = new CadastroDeConta(form1);

nesse momento você está instanciando o objeto CadastroDeConta passando o form1 (que é uma referência de objeto do tipo Form1) como parâmetro no construtor, e ela vai guarda essa referência do form1 no atributo dela, então você pode ter acesso a ela fazendo cadeias de invocação por exemplo:

cadastroDeConta.formularioPrincipal.algumMetodoDoFormuluarioPrincipal();

Lembre-se também que no paradigma orientado a objetos, sempre tente trazer os problemas mais próximas do mundo real. Pra você não faz sentido um CadastroDeConta TER um formulárioPrincipal? enteda esse TER como atributos da classe, por exemplo uma pessoa TEM idade, TEM peso, TEM altura etc... isso tudo seria atributos da minha classe Pessoa. A diferença é que no caso da classe CadastroDeConta tem um atributo que é uma referência para um objeto do tipo Form1.

Mas ainda nao entendo porque tenho que instanciar um objeto do tipo Form1, porque diretamente nao faco referencia ao Form1, já que é nele que coloquei todo o meu codigo?

É exatamente isso que estamos fazendo com esse código, apenas uma referência :) Note que não utilizamos o new em lugar nenhum, ou seja, não é instanciado nenhum objeto, apenas atualizamos a referência interna da classe CadastroDeConta para apontar para um formulário que já existe.

Pelo que eu percebi, você já entendeu os conceitos direitinho, a dúvida parece ser na questão da sintaxe. A linha que você comentou apenas faz uma atribuição de referências, mais especificamente do argumento recebido para o atributo da própria classe. Nenhum novo objeto é criado nesse processo.

Antes dessa linha, a memória está assim:

formularioPrincipal vale null (e tem o escopo do seu objeto do tipo CadastroDeConta)
referenciaRecebida aponta para o seu formulárioPrincipal (mas o escopo dela é só no construtor)

Para podermos utilizar essa referência mais pra frente, copiamos uma variável que só existe no construtor (referenciaRecebida) para uma variável que existe no escopo do objeto (formularioPrincipal). Assim, após aquela linha, a memória está assim:

formularioPrincipal aponta para o seu formulárioPrincipal (e tem o escopo do seu objeto do tipo CadastroDeConta)
referenciaRecebida aponta para o seu formulárioPrincipal (mas o escopo dela é só no construtor)

Aí, podemos sair do construtor (e com isso jogar fora a variável referenciaRecebida) e continuar usando a variável formulárioPrincipal para acessar o formulário principal.