C# | Sobrecarga de constructores

Requisito previo: Constructores en C#

Es bastante similar a la sobrecarga del método . Es la capacidad de redefinir un Constructor en más de una forma. Un usuario puede implementar la sobrecarga de constructores definiendo dos o más constructores en una clase que comparten el mismo nombre. C# puede distinguir los constructores con diferentes firmas. es decir, el constructor debe tener el mismo nombre pero con una lista de parámetros diferente.

Podemos sobrecargar los constructores de diferentes maneras de la siguiente manera:

  • Mediante el uso de diferentes tipos de argumentos
  • Usando diferente número de argumentos
  • Usando diferente orden de argumentos

Al cambiar los tipos de datos de los parámetros

Ejemplo:

public ADD (int a, float b);
public ADD (string a, int b);

Aquí el nombre de la clase es ADD . En el primer constructor hay dos parámetros, el primero es int y otro es float y en el segundo constructor, también hay dos parámetros, el primero es de tipo string y el otro es de tipo int .
Aquí los constructores tienen el mismo nombre pero los tipos de parámetros son diferentes, similar al concepto de sobrecarga de métodos.

// C# program to Demonstrate the overloading of 
// constructor when the types of arguments 
// are different
using System;
  
class ADD {
      
    int x, y;
    double f;
    string s;
  
    // 1st constructor
    public ADD(int a, double b)
    {
        x = a;
        f = b;
    }
  
    // 2nd constructor
    public ADD(int a, string b)
    {
        y = a;
        s = b;
    }
  
    // showing 1st constructor's result
    public void show()
    {
        Console.WriteLine("1st constructor (int + float): {0} ",
                                                       (x + f));
    }
  
    // shows 2nd constructor's result
    public void show1()
    {
        Console.WriteLine("2nd constructor (int + string): {0}", 
                                                       (s + y));
    }
}
  
// Driver Class
class GFG {
      
    // Main Method
    static void Main()
    {
          
        // Creating instance and
        // passing arguments
        // It will call the first constructor
        ADD g = new ADD(10, 20.2);
      
        // calling the method
        g.show();
  
  
        // Creating instance and 
        // passing arguments
        // It will call the second constructor
        ADD q = new ADD(10, "Roll No. is ");
      
        // calling the method
        q.show1();
    }
}
Producción:

1st constructor (int + float): 30.2 
2nd constructor (int + string): Roll No. is 10

Al cambiar el número de los parámetros

En este caso, utilizaremos dos o más constructores que tengan diferente número de parámetros. Los tipos de datos de los argumentos pueden ser los mismos, pero el número de parámetros será diferente.

Ejemplo:

public ADD (int a, int b);
public ADD (int a, int b, int c);

Aquí, el nombre de la clase es ADD . En el primer constructor, el número de parámetros es dos y los tipos de parámetros son int . En el segundo constructor, el número de parámetros es tres y los tipos de parámetros también son int , no hay problema con los tipos de datos.

// C# Program to illustrate the overloading of 
// constructor when the number of parameters 
// are different
using System;
  
class ADD {
      
    int x, y;
    int f, p, s;
  
    // 1st constructor
    public ADD(int a, int b)
    {
        x = a;
        y = b;
    }
  
    // 2nd constructor
    public ADD(int a, int b, int c)
    {
        f = a;
        p = b;
        s = c;
    }
  
    // showing 1st constructor's result
    public void show()
    {
        Console.WriteLine("1st constructor (int + int): {0} ", 
                                                     (x + y));
    }
  
    // showing 2nd constructor's result
    public void show1()
    {
        Console.WriteLine("2nd constructor (int + int + int): {0}", 
                                                      (f + p + s));
    }
}
  
// Driver Class
class GFG {
      
    // Main Method
    static void Main()
    {
          
        // will call 1st constructor
        ADD g = new ADD(10, 20);
          
        // calling method
        g.show();
  
        // will call 2nd constructor
        ADD q = new ADD(10, 20, 30);
      
        // calling method
        q.show1();
          
    }
}
Producción:

1st constructor (int + int): 30 
2nd constructor (int + int + int): 60

Cambiando el Orden de los parámetros

Ejemplo:

public student(double a, int x, string s)
public student(string s, int x, double a)

Aquí, los dos constructores tienen los mismos tipos de parámetros, es decir, cada constructor tiene un tipo doble , un tipo int y un parámetro de tipo string , pero las posiciones de los parámetros son diferentes. El compilador invocará al constructor de acuerdo con el orden de sus argumentos.

// C# program to illustrate the overloading of
// constructor by changing the order of parameters
using System;
  
class student {
      
    public int roll;
    public double Height;
    public string name;
  
    public student(double a, int x, string s)
    {
        roll = x;
        name = s;
        Height = a;
    }
  
    // order of the argument is different
    // with respect to 1st constructor
    public student(string s, int x, double a)
    {
        Height = a;
        roll = x;
        name = s;
    }
  
    public void show()
    {
        Console.WriteLine("Roll Number: " + roll);
        Console.WriteLine("Height: " + Height + "feet");
        Console.WriteLine("Name: " + name);
    }
}
  
// Driver Class
class Geeks {
      
    // Main Method
    static void Main()
    {
          
        // invoking 1st constructor
        student s1 = new student(5.7, 10, "Jhon Peterson");
          
        // invoking 2nd constructor
        student s2 = new student("Peter Perker", 11, 6.0);
          
        Console.WriteLine("First Constructor: ");
        s1.show();
  
        Console.WriteLine();
  
        Console.WriteLine("Second Constructor: ");
        s2.show();
          
    }
}
Producción:

First Constructor: 
Roll Number: 10
Height: 5.7feet
Name: Jhon Peterson

Second Constructor: 
Roll Number: 11
Height: 6feet
Name: Peter Perker

Invocar un constructor sobrecargado usando la palabra clave «esta»

Podemos llamar a un constructor sobrecargado desde otro constructor usando esta palabra clave, pero el constructor debe pertenecer a la misma clase, porque esta palabra clave apunta a los miembros de la misma clase en la que se usa. Este tipo de llamada al constructor sobrecargado también se denomina enstringmiento de constructores .

Ejemplo:

Let the class name is gfg,
Now
public gfg()
public gfg(int a) : this()
public gfg(double b) : this(int)

Aquí, el primer constructor es el constructor predeterminado, el segundo y el tercer constructor son constructores parametrizados, donde uno tiene un tipo int y otro tiene un parámetro de tipo doble.

En el segundo constructor, this() invoca al primer constructor, que es el constructor predeterminado . Aquí, después de esta palabra clave solo hay ( ) , lo que significa que el constructor de invocación del compilador que no tiene argumentos, significa constructor predeterminado.

En el tercer constructor, this(int) invoca al segundo constructor que es constructor parametrizado . Aquí, después de esto , hay (int) , lo que significa que el compilador invoca al constructor que tiene un argumento de tipo int .

// C# program to illustrate the invoking of
// overloaded constructor using this keyword
using System;
  
class GFG {
      
    // Private data members
    private int Length, Height;
    private double Width;
  
    // Default Constructor
    public GFG()
    {
        Console.WriteLine("Default Constructor Invoked");
    }
  
    // The constructor calls the
    // Default constructor
    public GFG(int l, double w) : this()
    {
        Console.WriteLine("Parameterized Constructor in 2nd Constructor");
          
        // assigning value of 
        // 'Length'and 'Width'
        Length = l;
        Width = w;
          
    }
  
    // The constructor call the
    // parameterized constructor
    public GFG(int l, double w, int h) : this(l, w)
    {
        Console.WriteLine("Parameterized Constructor in 3rd Constructor");
          
        // assign value of 'Height'
        Height = h;
      
    }
      
    // Public Method to calculate volume
    public double Volume()
    {
        return (Length * Width * Height);
    }
}
  
// Driver Class
class Geeks {
      
    // Main Method
    public static void Main()
    {
          
        // Invoking 3rd Constructor
        // here Constructor chaining
        // came into existence
        GFG g = new GFG(10, 20.5, 30);
  
        // calling the 'Volume' Method
        Console.WriteLine("Volume is : {0}", g.Volume());
  
    }
}
Producción:

Default Constructor Invoked
Parameterized Constructor in 2nd Constructor
Parameterized Constructor in 3rd Constructor
Volume is : 6150

Sobrecarga de Copy Constructor

Un constructor parametrizado que contiene un parámetro del mismo tipo de clase se denomina constructor de copia. Básicamente, el constructor de copias es un constructor que copia datos de un objeto en otro objeto. Su uso principal es inicializar una nueva instancia a los valores de una instancia existente.

// C# program to illustrate the
// overloading of Copy Constructor
using System;
  
class GFG {
      
    public string p1, p2;
    public int p3, p4;
  
    // 1st Constructor
    public GFG(string x, string y)
    {
        p1 = x;
        p2 = y;
    }
  
    // Copy Constructor of 1st Constructor
    public GFG(GFG gf)
    {
        p1 = gf.p1;
        p2 = gf.p2;
    }
  
    // 2nd Constructor with different
    // types pf parameter
    public GFG(int a, int b)
    {
        p3 = a;
        p4 = b;
    }
  
    // Copy Constructor of 2nd Constructor
    // Here number of parameter is different
    // with respect to 1st Constructor
    public GFG(GFG a, GFG b)
    {
        p3 = a.p3;
        p4 = b.p4;
    }
}
  
// Driver Class
class Geeks {
      
// Main Method
static void Main()
{
      
    // Create instance to class 'GFG'
    GFG g = new GFG("Welcome", "GeeksForGeeks");
      
    // Here 'g' details will copied to 'g1'
    GFG g1 = new GFG(g);
  
    Console.WriteLine(g1.p1 + " to " + g1.p2);
  
    // Create instance to class 'GFG' 
    // with different types of parameter
    GFG G = new GFG(10, 20);
      
    // Here 'G' details will copied to 'G1'
    GFG G1 = new GFG(G, G);
  
    Console.WriteLine("Overloaded values : {0} and {1}", 
                                          G1.p3, G1.p4);
  
}
}
Producción:

Welcome to GeeksForGeeks
Overloaded values : 10 and 20

Nota:

  • El constructor estático no se puede sobrecargar, porque los constructores estáticos son constructores sin parámetros, pero para la sobrecarga, debemos necesitar un constructor parametrizado.
  • Private Constructor puede sobrecargarse y podemos usarlo como instancia de esta clase dentro de la misma clase. No se puede acceder a los miembros privados desde fuera de la clase.

Publicación traducida automáticamente

Artículo escrito por SoumikMondal 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 *