none
sobrecarga de construtores RRS feed

  • Pergunta

  • Olá colegas estou a procurar uma solução porem sem destino.

    preciso criar duas classes a "ClassePai" e a "ClasseFilha" certo agora:

    public class ClassePai
    {
        public ClassePai(string nome)
        {
            //minha definição
        }
    }

    Acima esta a definição da classePai e seu construtor

    public class ClasseFilha : ClassePai
    {
        public ClasseFilha(string nome) : base(nome)
        {
            //minha definição
            if(nome == "joao")
            {
                nome = "maria";
            }
        }
    }

    Acima esta a definição da classe filha e seu construtor, sendo que na documentação da Microsoft só achei está, sendo que o problema meu é que desta forma o construtor da classe pai é disparado primeiro, como consigo usar este tipo de implementação, minha lógica é a classeFilha tratar o valor no construtor e informar a classePai através do construtor dele o valor atualizado, queria ter o mesmo resultado do PHP

    class ClassePai {
    
        public function __construct($nome) {
            //minha definição
        }
    }
    
    class ClasseFilha extends ClassePai {
    
        public function __construct($nome) {
            if ($nome == "joao") {
                $nome = "maria";
            }
            parent::__construct($nome);
        }
    }
    

    Acima está a definição em PHP, e este resultado queria ter em C#

    sábado, 18 de agosto de 2018 00:18

Respostas

  • Eu entendi sua situação.

    A Orientação à objeto e alguns conceitos do PHP são bem diferentes de outras linguagens.

    Acho que a única forma de fazer o que você quer seria da minha resposta anterior.

    Resumidamente, C#, Java, entre outras linguagens que "nasceram" pra serem orientadas à objeto, foram montadas pra respeitar a hierarquia da herança. Você implementa o construtor. Não altera o construtor pai.

    Se você altera a ordem da chamada na classe filho, você compromete a classe pai, visto que, algumas informações possam ser carregadas no construtor PAI e se tu alterar a ordem e o filho tentar acessar, elas ainda estariam nulas, causando erro.

    Acho que, como pretende trocar de linguagem, seria importante dar uma olhada na documentação, pois são linguagens que abordam outro tipo de conceitos e de formas beeeeem diferentes. 

    terça-feira, 21 de agosto de 2018 12:25

Todas as Respostas

  • Boa noite

    Cara, isso "não da pra fazer" com C#. Na verdade isso que vc quer fazer ultraja todas as boas praticas e conceitos da orientação à objeto

    Algo próximo do que você quer fazer, mas que ainda é estranho, seria o seguinte:

        public abstract class ClassA
        {
            public string Nome { get; protected set; }
    
            public ClassA(string nome)
            {
                this.Nome = nome;
                this.ProcessName(Nome);
            }
    
            public abstract void ProcessName(string name);
    
    
        }
    
        public class ClassB : ClassA
        {
            public ClassB(string nome) : base(nome)
            {
    
            }
    
            public override void ProcessName(string name)
            {
                if (name.Equals("joao"))
                {
                    this.Nome = "maria";
                }
            }
        }
    Só não entendi realmente pq precisa inverter a ordem do construtor

    sábado, 18 de agosto de 2018 01:42

  • Olá Thiago, seguinte, sua duvida por que eu preciso alterar a ordem dos construtores é a seguinte, trabalho com PHP a muitos anos, e por natureza da linguagem temos a liberdade de chamar o construtor pai ou ate mesmo não chamar caso necessário, ou caso uma classe filha nem chame o construtor da classe pai e chame a classe avo veja a implementação em PHP
    class ClasseAvo {
    
        public function __construct($nome) {
            //minha definição
        }
    }
    
    class ClassePai extends ClasseAvo {
    
        public function __construct($nome) {
            //minha definição
        }
    }
    
    class ClasseFilha extends ClassePai {
    
        public function __construct($nome) {
            if ($nome == "joao") {
                $nome = "maria";
            }
            //ignorando o construtor pai e chamando o avo
            parent::ClasseAvo($nome);
        }
    }
    Este tipo de abordagem no construtor é muito útil quando se fala em Polimorfismo, ou seja mudar a característica que estou herdando e fazer uma nova classe herdando propriedades e métodos de uma superclasse, pois vendo c# deste ponto até agora tenho que fazer uma implementação diferente

    sábado, 18 de agosto de 2018 15:41
  • Eu entendi sua situação.

    A Orientação à objeto e alguns conceitos do PHP são bem diferentes de outras linguagens.

    Acho que a única forma de fazer o que você quer seria da minha resposta anterior.

    Resumidamente, C#, Java, entre outras linguagens que "nasceram" pra serem orientadas à objeto, foram montadas pra respeitar a hierarquia da herança. Você implementa o construtor. Não altera o construtor pai.

    Se você altera a ordem da chamada na classe filho, você compromete a classe pai, visto que, algumas informações possam ser carregadas no construtor PAI e se tu alterar a ordem e o filho tentar acessar, elas ainda estariam nulas, causando erro.

    Acho que, como pretende trocar de linguagem, seria importante dar uma olhada na documentação, pois são linguagens que abordam outro tipo de conceitos e de formas beeeeem diferentes. 

    terça-feira, 21 de agosto de 2018 12:25
  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 19 de setembro de 2018 19:32
    Moderador