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) {…}
}
Но не забывайте о том, что при перегрузке члена возвращаемый тип не может быть независимым. Так, следующий вариант просто недопустим.
public class Triangle {
…
// Ошибка! Нельзя перегружать методы
// на основе возвращаемых значений!
public float GetX{…}
public int GetX{…}
}
Использование this для возвратных ссылок в C#
Обратите внимание на то, что другой конструктор класса Employee использует ключевое слово C# this.
// Явное использование "this" для разрешения конфликтов имен.
publiс Employee(string fullName, int empID, float currPay) {
// Присваивание входных параметров данным состояния.
this.fullName = fullName;
this.empID = empID;
this.currPay = currPay;
}
Это ключевое слово C# используется тогда, когда требуется явно сослаться на поля и члены текущего объекта. Причиной использования ключевого слова this в этом пользовательском конструкторе является стремление избежать конфликта имен параметров и внутренних переменных состояния. Альтернативой могло бы быть изменение имен всех параметров.