Pис. 4.1. Тип класса Employee
Вспомните из главы 3 что классы в C# могут определять любое число конструкторов - это специальные методы класса, обеспечивающие пользователю объекта простую возможность создания экземпляров данного класса с заданным поведением. Каждый класс в C# изначально обеспечивается конструктором, заданным по умолчанию, который по определению никогда не имеет аргументов. В дополнение к конструктору, заданному по умолчанию, можно определить любое число пользовательских конструкторов .
Для начала мы определим вашу первую модификацию класса Employee (по мере изучения материала данной главы мы будем добавлять в этот класс новые функциональные возможности).
// Исходное определение класса Employee.
namespace Employees {
public class Employee {
// Поля данных.
private string fullName;
private int empID;
private float currPay;
// Конструкторы.
public Employee(){}
public Employee(string fullName, int empID, float currPay) {
this.fullName = fullName;
this.empIP = empID;
this.currPay = currPay;
}
// Увеличение выплаты для данного работника.
public void GiveBonus(float amount) { currPay += amount; }
// Текущее состояние объекта.
public void DisplayStats() {
Console.WriteLine("Имя: {0} ", fullName);
Console.WriteLine("З/п: {0} ", currPay);
Console . WriteLine("Код: {0} ", empID) ;
}
}
}
Обратите внимание на реализацию конструктора по умолчанию (он оказывается пустым) для класса Employee.
public class Employee {
…
public Employee(){}
…
}
Подобно C++ и Java, если в определении C#-класса задаются пользовательские конструкторы, то конструктор, заданный по умолчанию, отключается без предупреждений. Если вы хотите позволить пользователю объекта создавать экземпляры вашего класса следующим образом:
static void Main(string[] args) {
// Вызов конструктора, заданного до умолчанию.
Employee e = new Employee();
}
то должны явно переопределить конструктор, заданный по умолчанию. Если этого не сделать, то при создании экземпляра вашего класса с помощью конструктора по умолчанию вы получите ошибку компиляции. Так или иначе, следующий метод Main() создает целый ряд объектов Employee, используя наш пользовательский конструктор с тремся аргументами.
// Создание нескольких объектов Employee.
static void Main(string[] args) {
Employee e = new Employee("Джо", 80, 30000);
Employee e2;
e2 = new Employee("Бет", 81, 50000);
Console.ReadLine();
}
Подобно другим объектно-ориентированным языкам, язык C# позволяет типу перегружать его методы. Говоря простыми словами, когда класс имеет несколько членов с одинаковыми именами, отличающихся только числом (или типом) параметров, соответствующий член называют перегруженным. В классе Employee перегруженным является конструктор класса, поскольку предложены два определения, которые отличаются только наборами параметров.
public class Employee {
...
// Перегруженные конструкторы.
public Employee(){}
public Employee(string fullName, int empID, float currPay) {…}
...
}
Конструкторы, однако, не являются единственными членами, допускающими перегрузку. Продолжив рассмотрение текущего примера, предположим, что у нас есть класс Triangle (треугольник), который поддерживает перегруженный метод Draw(). С его помощью пользователю объекта позволяется выполнить визуализацию изображений, используя различные входные параметры.
public class Triangle {
// Перегруженный метод Draw().
public void Draw(int x, int y, int height, int width) {…}
public void Draw(float x, float y, float height, float width) {…}
public void Draw(Point upperLeft, Point bottomRight) {…}
public void Draw(Rect r) {…}
}
Если бы в C# не поддерживалась перегрузка методов, вы были бы вынуждены создать четыре члена с уникальными именами, что, как можете убедиться, весьма далеко от идеала.
public class Triangle {
// Глупость…
public void DrawWithInts(int x, int y, int height, int width) {…}
public void DrawWithFloats(float x, float y, float height, float width) {…}
public void DrawWithPoints(Point upperLeft, Point bottomRight) {…}
public void DrawWithRect(Rect r) {…}
}
Но не забывайте о том, что при перегрузке члена возвращаемый тип не может быть независимым. Так, следующий вариант просто недопустим.
Читать дальше