Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

problemas com herança múltipla

Olá, bom dia! Estou com uma dúvida em relação sobre herança múltipla, gastei muito tempo ontem para descobri o problema do código e consegui encontrar, porém não soube explicar o porquê disto esta acontecendo, vamos lá. O exercício é o da aula 4 do curso C# parte 3, onde tenho que criar um sistema de autentificação, o link do código é este: https://repl.it/@jocygneto/ByteBank

Quando tento criar meu método estático na classe Program com os seguintes atributos

public static void UsarSistema()
        {
            SistemasInterno sistema = new SistemasInterno();

            Funcionario roberta = new Diretor("159.753.398-04");
            roberta.Nome = "Roberta";
            roberta.Senha = "123";

            Funcionario camila = new GerenteDeConta("326.985.628-89");
            camila.Nome = "Camila";
            camila.Senha = "abc";


            sistema.Logar(roberta, "123");
            sistema.Logar(camila, "abc");

        }

Da erro dizendo: (quando estou com o mouse em cima do sumblinhado roberta.Senha e camila.Senha)

" 'Funcionario' não há uma definição para 'Senha' e não foi possivel encontra nenhum método de extensão 'Senha' acessivel que aceite um primeiro argumento do tipo 'Funcionario' (há uma diretiva de uso ou referencia assembly ausente?)."

e em sistema.Logar(roberta, "123"); sistema.Logar(camila, "abc"); o erro é:

Argumento 1: Não é possivel converter "ByteBank.Funcionario.Funcionario" para "ByteBank.Sistemas.Autenticavel".

já quando utilizo da seguinte forma:

 public static void UsarSistema()
        {
            SistemasInterno sistema = new SistemasInterno();

            Diretor roberta = new Diretor("159.753.398-04");
            roberta.Nome = "Roberta";
            roberta.Senha = "123";

            GerenteDeConta camila = new GerenteDeConta("326.985.628-89");
            camila.Nome = "Camila";
            camila.Senha = "abc";


            sistema.Logar(roberta, "123");
            sistema.Logar(camila, "abc");

        }

Não há erros e executa de forma normal. Por que isto acontece?

Se poderem me ajudar a esclarecer a dúvida ficarei muito agradecido.

Ao Guilherme, gostaria de deixar meus sinceros agradecimentos, devido sua sagacidade de ensinar, estou me tornando um dos melhores em C# na faculdade, valeu!

1 resposta
solução!

Opa, Jocy. Tudo bom?

A hierarquia das suas classes GerenteDeConta e Diretor são:

  • GerenteDeConta -> Autenticavel -> Funcionario; e
  • Diretor -> Autenticavel -> Funcionario.

Se temos uma referência de Diretor ou GerenteDeConta já sabemos que podemos a usar como Autenticavel ou Funcionario, por conta da hierarquia de herança.

Mas, se temos uma referência de Funcionario, não há nenhuma garantia de que esta referência é do tipo Autenticavel, afinal, Autenticavel deriva de Funcionario e não o contrário.

Quando você cria uma variável com Funcionario camila; a única garantia que temos é que camila sempre será uma referência de um Funcionario - e aqui não temos Senha!

Se você precisa dos membros de Autenticavel, poderá escrever Autenticavel camila = new GerenteDeConta(...) - porque GerenteDeConta é Autenticavel, como vimos na hierarquia.

O que você acha? Ficou mais claro?

E obrigado pela mensagem, fico bastante feliz em saber que você tá mandando bem em C# :)