Перегрузка конструктора в C#

Перегрузка конструктора очень похожа на перегрузку метода. Это возможность переопределить конструктор в более чем одной форме. Пользователь может реализовать перегрузку конструктора, определив два или более конструкторов в классе с одинаковым именем. C# может различать конструкторы с разными сигнатурами. т.е. конструктор может иметь то же имя, но с другим списком параметров.

Мы можем перегрузить конструкторы несколькими способами:

  • Используя аргументы другого типа
  • Используя разное количество аргументов
  • Используя другой порядок аргументов

Разные типы данных параметров

Пример:

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

Здесь имя класса ADD . В первом конструкторе есть два параметра, первый - int, другой - float, а во втором конструкторе также есть два параметра, первый - строкового типа, а другой - типа int .
Здесь конструкторы имеют одно и то же имя, но типы параметров разные, что похоже на концепцию перегрузки метода.

// Программа на C# для демонстрации перегрузки
// конструкторов, когда типы аргументов разные
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();
    }
}

Вывод:

1-й конструктор (int + float): 30,2 
2-й конструктор (int + string): Roll No. 10

Изменение количества параметров

В этом случае мы будем использовать два или более конструктора с разным количеством параметров. Типы данных аргументов могут быть одинаковыми, но количество параметров будет другим.

Пример:

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

Здесь имя класса - ADD . В первом конструкторе количество параметров равно двум, а типы параметров - int . Во втором конструкторе количество параметров равно трем, и типы параметров также являются int

// Программа на C# для демонстрации перегрузки
// конструктора, когда количество параметров разные
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();
          
    }
}

Вывод:

1-й конструктор (int + int): 30 
2-й конструктор (int + int + int): 60

Конструкторы с разным порядком объявления параметров

Пример:

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

Здесь два конструктора содержат одни и те же типы параметров, то есть каждый конструктор имеет один тип double , один тип int и один параметр string типа, но позиции параметров различаются. Компилятор вызовет конструктор в соответствии с порядком их аргументов.

// 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();
          
    }
}
Вывод:
Первый конструктор: 
Номер рулона: 10
Высота: 5,7 футов
Имя: Джон Петерсон

Второй конструктор: 
Номер рулона: 11
Высота: 6 футов
Имя: Питер Перкер

Вызов перегруженного конструктора с помощью ключевого слова this

Мы можем вызвать перегруженный конструктор из другого конструктора , используя это ключевое слово , но конструктор должен быть принадлежать к тому же классу, потому что это ключевое слово указывает члены одного и того же класса , в котором это используется. Этот тип вызова перегруженного конструктора также называется цепочкой конструкторов .

Пример:

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

Здесь первый конструктор является конструктором по умолчанию, второй и третий конструкторы - это параметризованный конструктор, один из которых имеет тип int, а другой - параметр типа double.

Во втором конструкторе this() вызывает первый конструктор, который является конструктором по умолчанию. Здесь после этого ключевого слова есть only(), что означает, что компилятор вызывает конструктор без аргументов, означает конструктор по умолчанию.

В третьем конструкторе this(int) вызывает второй конструктор, который является параметризованным конструктором. Здесь после этого стоит (int), что означает, что компилятор вызывает конструктор с аргументом типа int.

// Программа C# для примера вызова
// перегруженного конструктора с использованием ключевого слова this
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());
  
    }
}

Вывод:

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

Перегрузка конструктора копирования

Параметризованный конструктор, содержащий параметр того же типа класса, называется конструктором копирования. По сути, конструктор копирования - это конструктор, который копирует данные одного объекта в другой объект. Его основное использование - инициализировать новый экземпляр значениями существующего экземпляра.

// 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", "My Website");

        // 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);

    }
}

Вывод:

Welcome to My Website
Overloaded values : 10 and 20

Примечание:

  • Статический конструктор не может быть перегружен, потому что статические конструкторы - это конструктор без параметров, но для перегрузки нам необходим параметризованный конструктор.
  • Закрытый конструктор может быть перегружен, и мы можем использовать это экземпляром этого класса внутри того же класса. К закрытым членам нельзя получить доступ извне класса.