sexta-feira, 17 de outubro de 2014

Domine a herança de construtores

Em hierarquias longas de objetos é importante saber onde colocar o código dos contructors (construtores) pois eles tem uma ordem lógica para executar e, se for um parameterless constructor (construtor sem parâmetros) então todos os parameterless constructors serão executados desde a raiz object.

Um parameterless constructor sempre executa o parameterless constructor da classe base (pai), mas um construtor com parâmetros você deve especificar:


  1. :this([parametros]) para executar um outro constructor na mesma classe e deixar a hierarquia seguir sucessivamente
  2. :base([parametros]) para executar um constructor específico da classe base
  3. NADA para executar o parameterless constructor da base.


O programa abaixo ilustra isso.


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

namespace HerancaConstrutor
{

    class ClasseBase
    {
        public ClasseBase()
        {
            Console.WriteLine("parameterless constructor da classe ClasseBase");
        }
    }

    class DerivadaSemConstructor : ClasseBase
    {
        
    }


    class DerivadaComConstructor : ClasseBase
    {
        public DerivadaComConstructor()
        {
            Console.WriteLine("parameterless constructor da classe DerivadaComConstructor");
        }

        public DerivadaComConstructor(string argumento)
        {
            Console.WriteLine("constructor com argumentos da classe DerivadaComConstructor. Argumento: " + argumento);
        }
    }


    class DerivadaDaDerivadaSemConstructor : DerivadaSemConstructor
    {
        
    }

    class DerivadaDaDerivadaComConstructor : DerivadaComConstructor
    {
        public DerivadaDaDerivadaComConstructor()
            : base("")
        {
            Console.WriteLine("parameterless constructor da classe DerivadaDaDerivadaComConstructor");
        }

        public DerivadaDaDerivadaComConstructor(string argumento) : base(argumento)
        {
            Console.WriteLine("constructor com argumentos da classe DerivadaDaDerivadaComConstructor. Argumento: " + argumento);
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            var v1 = new ClasseBase();

            var v2 = new DerivadaSemConstructor();
            var v3 = new DerivadaComConstructor();
            var v3b = new DerivadaComConstructor("b");

            var v4 = new DerivadaDaDerivadaSemConstructor();
            var v5 = new DerivadaDaDerivadaComConstructor();
            var v5b = new DerivadaDaDerivadaComConstructor("b");
        }
    }
}



Toda classe sem parameterless constructor padrão possui um parameterless constructor implícito herdado de object.
Toda classe com um parameterless constructor implicitamente executa o parameterless constructor da classe base, estando ele sendo chamado com :base() explicitamente ou não.

Se um constructor não é criado eecuta o parameterless constructor da classe base
se um constructor é criado mas não é definido um constructor base é executado o parameterless constructor da base.
se um construtor é criado e é especificado um outro construtor da classe base com argumentos para ser executado, é executado o constructor escolhido e o constructor da classe ancestral da base é executado.
Se um constructor chama outros constructors, com ou sem parâmetros, na classe atual ou na classe base, não importa, uma hora um constructor parameterless implícito ou explícito será executado.

Nenhum comentário:

Postar um comentário

Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)