Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Classe somente acessa o tipo do atributo e não o tipo - caracPess.nome

//------------------------------------------CLASSE
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace classOnclass
{
    public class PessoaBase
    {
        public string nome;
    }
    public class PessoaCarac
    {
        public PessoaBase nome; 
    }
}


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

namespace classOnclass
{
    class Program
    {
        static void Main(string[] args)
        {
            PessoaBase basePess = new PessoaBase();
            PessoaCarac caracPess = new PessoaCarac();


            basePess.nome = "Ricardo";

            Console.WriteLine();
            Console.WriteLine(basePess.nome);
            Console.WriteLine(caracPess.nome);

            Console.ReadLine();

        }
    }
}
4 respostas

Olá, Ricardo. Boa noite, tudo bom?

  • PessoaBase possui um campo público do tipo string chamado nome;
  • PessoaCarac possui um campo público do tipo PessoaBase chamado nome;

Você criou duas variáveis:

PessoaBase basePess = new PessoaBase();
PessoaCarac caracPess = new PessoaCarac();

Neste momento, basePess .nome possui o valor padrão de string(null) e caracPess.nome também possui o valor padrão de PessoaBase(null).

Você só realizou atribuição em basePess.nome enquanto que caracPess.nome continuou nulo.

Ficou mais claro a execução da aplicação? Talvez sua intenção fosse realizar a atribuição caracPess.nome = basePess?

O que você acha? Poderia dar mais detalhes sobre o que o código deveria fazer?

Forte abs.

Entendi! Tem toda razão, mas como fazer para que a classe2 (caracPess) receba o nome já atribuído na classe1 (basePess) ? No vídeo da aula o valor já seria atribuído automaticamente - no momento da atribuicao do valor na classe1. Fiquei com dúvida como fazer isso, e na sua sugestão de solução, quando atribuo caracPess.nome = basePess o caracPess.nome recebe o type : classOnclass.PessoaBase ao inves do conteudo do "nome" na classe1. Obrigado pela ajuda.

solução!

Opa, então você precisa que os membros da classe PessoaBase estejam disponíveis na PessoaCarac.

Para isto, usamos a herança! No C#, a sintaxe de herança é:

class ClasseDerivada : ClasseBase
{
}

No curso, usamos o exemplo dos funcionários do banco ByteBank, então criamos a classe base Funcionario:

public class Funcionario
{
    public string nome;
    public double salario;
}

A partir disto, podemos criar um Analista e, para não repetir a definição do nome e salario, herdamos de Funcionario:

public class Analista : Funcionario
{
    public string especialidade;
}

(nesse exemplo adicionei o campo especialidade em Analista)

Para usar o código, ficamos com :

Analista mariana = new Analista();
mariana.nome = "Mariana";
mariana.especialidade = "Computação de alta performance";

Mas, todo objeto do tipo Analista é também Funcionario, afinal, fizemos a herança. Então podemos escrever o código abaixo:

Funcionario mariana = new Analista();
mariana.nome = "Mariana";

Perceba, contudo, que agora que a variável mariana é do tipo Funcionario e não mais do tipo Analista. O tipo Funcionario não define um membro chamado especialidade, então o código abaixo não compila:

Funcionario mariana = new Analista();
mariana.nome = "Mariana";
mariana.especialidade = "Computação de alta performance"; // erro aqui

No seu caso de PessoaBase e PessoaCarac, teremos:

public class PessoaBase
{
    public string nome;
}
public class PessoaCarac : PessoaBase
{
}

O que você acha? Ajudei com a dúvida?

Abs.

Oi Guilherme !

Muito bom !!!!

Obrigado pela ajuda. Exatamente o que precisava! Muito obrigado pela rápida resposta! Ricardo