Перегрузка конструктора очень похожа на перегрузку метода. Это возможность переопределить конструктор в более чем одной форме. Пользователь может реализовать перегрузку конструктора, определив два или более конструкторов в классе с одинаковым именем. 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
Примечание:
- Статический конструктор не может быть перегружен, потому что статические конструкторы - это конструктор без параметров, но для перегрузки нам необходим параметризованный конструктор.
- Закрытый конструктор может быть перегружен, и мы можем использовать это экземпляром этого класса внутри того же класса. К закрытым членам нельзя получить доступ извне класса.