C# | Herencia en Constructores – Part 1

En C#, tanto la clase base como la clase derivada pueden tener su propio constructor. El constructor de una clase base que se usa para instanciar los objetos de la clase base y el constructor de la clase derivada que se usa para instanciar el objeto de la clase derivada. En la herencia, la clase derivada hereda todos los miembros (campos, métodos) de la clase base, pero la clase derivada no puede heredar el constructor de la clase base porque los constructores no son miembros de la clase. En lugar de heredar los constructores de la clase derivada, solo se permite invocar al constructor de la clase base.

En C#, cuando estamos trabajando con el constructor en herencia, surgen dos casos diferentes de la siguiente manera:

Caso 1: en este caso, solo la clase derivada contiene un constructor . Entonces, los objetos de la clase derivada son instanciados por ese constructor y los objetos de la clase base son instanciados automáticamente por el constructor predeterminado.

Ejemplo:

// C# program to illustrate the
// concept of inheritance in the
// constructor when the derived
// class contains a constructor
using System;
  
// Class Tank to give the
// dimension of the tank
class Tank {
  
    double t_radius;
    double t_height;
  
    // Properties for Radius and Height
    public double Radius
    {
        get { 
               return t_radius; 
            }
  
        set {
               t_radius = value < 0 ? -value : value;
            }
    }
  
    public double Height
    {
        get { 
               return t_height; 
            }
  
        set { 
              t_height = value < 0 ? -value : value; 
            }
    }
  
    // Display the dimension of tanks
    public void DisplayDimension()
    {
        Console.WriteLine("The radius of tank is :" + Radius 
                 + " and the height of tank is :" + Height);
    }
}
  
// A derived class AreaOfTank 
// inheriting Tank Class
class AreaOfTank : Tank {
  
    string Color;
  
    // Constructor
    public AreaOfTank(string c, double r, double h)
    {
  
        // from base class
        Radius = r;
        Height = h;
  
        // from derived class
        Color = c;
    }
  
    // Return area of tank
    public double Area()
    {
        return 2 * 3.14 * Radius * Height;
    }
  
    // Display the color of tank
    public void DisplayColor()
    {
        Console.WriteLine("The Color of tank is " 
                                        + Color);
    }
}
  
// Driver Class
class GFG {
  
    // Main Method
    static void Main()
    {
  
        // Create and initialize the
        // object of AreaOfTank
        AreaOfTank t1 = new AreaOfTank("Green", 6.0, 12.0);
        t1.DisplayColor();
        t1.DisplayDimension();
        Console.WriteLine("Area is " + t1.Area());
    }
}
Producción:

The Color of tank is Green
The radius of tank is :6 and the height of tank is :12
Area is 452.16

Explicación: En el ejemplo anterior , Tank es la clase base y AreaOfTank es la clase derivada. La clase de tanque proporciona las dimensiones del tanque y AreaOfTank proporciona el color y el área del tanque. Y la clase Tank no contiene ningún constructor, por lo que el constructor predeterminado se usa para instanciar el objeto de la clase y la clase AreaOfTank contiene el constructor AreaOfTank() que instancia el objeto de la clase.

Caso 2: En este caso, tanto la clase base como la clase derivada tienen sus propios constructores , por lo que el proceso es complicado porque se deben ejecutar los constructores de ambas clases. Para superar esta situación, C# proporciona una palabra clave conocida como palabra clave base . Con la ayuda de la palabra clave base, la clase derivada puede llamar al constructor que está definido en su clase base.

Nota: La palabra clave base puede llamar a cualquier forma del constructor definido en la clase base, pero solo se ejecuta el constructor que coincida con los argumentos.

Sintaxis:

derived-constructor(parameter-list) : base(argument-list)
{
   // body of constructor 
}

Aquí, la lista de argumentos contiene argumentos que requiere el constructor de la clase base.

Ejemplo:

// C# program to illustrate the concept of 
// inheritance in constructors when both 
// the base class and derived class 
// their own constructors
using System;
  
// Class Tank to give the 
// dimension of the tank
class Tank {
  
    double t_radius;
    double t_height;
  
    // Constructor for Tank
    public Tank(double r, double h)
    {
        Radius = r;
        Height = h;
    }
  
    // Properties for Radius
    // and Height
    public double Radius
    {
        get { 
               return t_radius; 
            }
  
        set { 
               t_radius = value < 0 ? -value : value; 
            }
    }
  
    public double Height
    {
        get { 
               return t_height; 
             }
  
        set { 
                t_height = value < 0 ? -value : value; 
            }
    }
  
    // Display the dimension of tanks
    public void DisplayDimension()
    {
        Console.WriteLine("The radius of tank is :" + Radius 
                 + " and the height of tank is :" + Height);
    }
}
  
// AreaOfTank is derived class 
// which is inheriting the Tank class
class AreaOfTank : Tank {
  
    string Color;
  
    // Call the Constructor of the 
    // base class, i.e Tank
    // Using base keyword
    public AreaOfTank(string c, double r,
                   double h) : base(r, h)
    {
        Color = c;
    }
  
    // Return area of tank
    public double Area()
    {
        return 2 * 3.14 * Radius * Height;
    }
  
    // Display the color of tank
    public void DisplayColor()
    {
        Console.WriteLine("The Color of tank is " + Color);
    }
}
  
// Driver Class
class GFG {
  
    // Main Method
    static void Main()
    {
        // Create and initialize the 
        // object of AreaOfTank
        AreaOfTank t1 = new AreaOfTank("Brown", 4.0, 8.0);
        t1.DisplayColor();
        t1.DisplayDimension();
        Console.WriteLine("Area is " + t1.Area());
    }
}
Producción:

The Color of tank is Brown
The radius of tank is :4 and the height of tank is :8
Area is 200.96

Explicación: En el ejemplo anterior, Tank es la clase base y AreaOfTank es la clase derivada. La clase Tank describe la dimensión del tanque y AreaOfTank describe el color y el área del tanque. Tanto la clase base como la clase derivada tienen su propio constructor. Pero declaramos el constructor de AreaOfTank con una palabra clave base como se muestra aquí:

public AreaOfTank(string c, double r, double h) : base (r, h)
{
   Color = c; 
}

Aquí AreaOfTank() llama al constructor de clase base con el parámetro r y h. Eso significa que se llama al constructor Tank() e inicializará el valor de Radius y Height en AreaOfTank(). Por lo tanto, no es necesario que la clase AreaOfTank inicialice estos valores. Si AreaOfTank requiere un campo adicional, entonces el campo debe ser único de los campos llamados como Color.
Al usar la palabra clave base, se vuelve más fácil inicializar los objetos de la clase base sin ningún conflicto y también proporciona una autoridad para llamar al constructor de una clase base desde la clase derivada y también ahorra el tiempo de volver a escribir los códigos.

Publicación traducida automáticamente

Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *