На этом шаге мы рассмотрим особенности доступа к закрытым членам класса и перегрузку методов.
Ранее мы познакомились с перегрузкой статических методов. Но перегружать можно и обычные методы. То есть в классе может быть описано несколько версий одного и того же метода. У таких версий одинаковые названия, но разные аргументы. При вызове метода версия метода определяется по количеству и типу аргументов, фактически переданных методу. Перегрузка методов проиллюстрирована в приведенной ниже программе. Там же используются закрытые члены класса (поля класса описаны с ключевым словом private). Рассмотрим представленный ниже программный код.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr83_1 { // Описание класса: class MyClass { // Закрытое целочисленное поле: private int number; // Закрытое символьное поле: private char symbol; // Открытый метод для отображения значения полей: public void show() { Console.WriteLine("Поля объекта: " + number + " и " +symbol); } // Открытый метод для присваивания значений полям. // Версия с двумя аргументами: public void set(int n, char s) { // Значение целочисленного поля number = n; // Значение символьного поля symbol = s; } // Открытый метод для присваивания значений полям. // Версия с одним целочисленным аргументом: public void set(int n) { number = n; // Значение целочисленного поля symbol = 'B'; // Значение символьного поля } // Открытый метод для присваивания значений полям. // Версия без аргументов: public void set() { // Вызов версии метода с двумя аргументами: set(100, 'А'); } } // Главный класс: class Program { // Главный метод: static void Main() { // Создание объекта: MyClass obj = new MyClass(); // Присваивание значений полям: obj.set(); // Отображение значений полей: obj.show(); // Присваивание значений полям: obj.set(200); // Отображение значений полей: obj.show(); // Присваивание значений полям: obj.set(300, 'C'); // Отображение значений полей: obj.show(); // Задержка: Console.ReadLine(); } } }
Результат выполнения программы представлен ниже.
Рис.1. Результат выполнения программы
Как отмечалось выше, в данном примере при описании класса MyClass поля number и symbol описаны с ключевым словом private. Это означает, что поля закрытые. К ним можно обращаться в программном коде класса, но за пределами класса они недоступны для прямого обращения.
Мы не можем обратиться к закрытым членам класса вне пределов класса напрямую. Допустим, имеется объект obj класса MyClass. Тогда в главном методе программы обратиться к полям number и symbol (при условии, что они закрытые) через имя объекта не получится. Зато мы можем вызвать открытый метод, который обращается к этим полям. Такой подход использован в рассматриваемой программе.
Как и ранее, в классе присутствует метод show(), отображающий в консольном окне значения полей number и symbol. Метод открытый, поэтому мы сможем его вызывать в главном методе программы из объектов класса MyClass (в реальности там всего один объект obj). Кроме метода show(), в классе MyClass описаны три версии метода set(). Метод set() предназначен для присваивания значений полям объекта. Дело в том, что поскольку поля закрытые, то после создания объекта напрямую (прямым обращением к полям) значения им присвоить не удастся. Но можно вызвать открытый метод, который и присвоит полям значения. Таким методом является set(). Если он вызывается с двумя аргументами (целочисленным и символьным), то значения аргументов присваиваются полям объекта, из которого вызывается метод. Если метод вызывается с одним целочисленным аргументом, то значение аргумента присваивается целочисленному полю number, а полю symbol присваивается значение 'В'. Наконец, в классе MyClass описана версия метода set() без аргументов. В описании этой версии метода есть всего одна команда
set(100, 'А'); ,
В главном методе программы командой
MyClass obj = new MyClass();
obj.set(); .
obj.show(); .
obj.set(200);
obj.set(300, 'C');
На следующем шаге мы поговорим о конструкторах.