Шаг 83.
Язык программирования C#. Начала
Знакомство с классами и объектами. Закрытые члены класса и перегрузка методов

    На этом шаге мы рассмотрим особенности доступа к закрытым членам класса и перегрузку методов.

    Ранее мы познакомились с перегрузкой статических методов. Но перегружать можно и обычные методы. То есть в классе может быть описано несколько версий одного и того же метода. У таких версий одинаковые названия, но разные аргументы. При вызове метода версия метода определяется по количеству и типу аргументов, фактически переданных методу. Перегрузка методов проиллюстрирована в приведенной ниже программе. Там же используются закрытые члены класса (поля класса описаны с ключевым словом 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, 'А');           , 
которой вызывается версия метода с двумя аргументами. В результате поле number получает значение 100, а поле symbol получает значение 'А'.


О рекурсии здесь речь не идет, поскольку одна версия метода вызывает другую (при рекурсии внутри метода вызывается та же версия метода).

    В главном методе программы командой

  MyClass obj = new MyClass();
создается объект obj класса MyClass. Присваивание значений полям объекта obj выполняется с помощью команды
  obj.set();              . 
В результате поле number объекта obj получает значение 100, а поле symbol этого объекта получает значение 'А'. Проверяем значения полей объекта с помощью команды
  obj.show();            . 
После выполнения команды
  obj.set(200);
поле number объекта obj получает значение 200, а поле symbol получает значение 'В'. Наконец, после выполнения команды
  obj.set(300, 'C');
значение поля number объекта obj равно 300, а значение поля symbol объекта obj равно 'С'.


Поля number и symbol закрытые, поэтому доступа из программного кода вне пределов класса к этим полям нет. Но методы set() и show() описаны в классе, поэтому они имеют доступ к полям. В главном методе программы мы не можем напрямую обратиться к закрытым полям, но можем вызвать открытые методы, которые имеют доступ к полям. Таким образом, получается, что мы "спрятали" поля и ввели "посредников" (методы), которые позволяют нам выполнять операции с полями - но только те, которые определены в методах. Это очень удобный подход, особенно если необходимо ограничить или упорядочить режим доступа к полям (или другим членам).

    На следующем шаге мы поговорим о конструкторах.




Предыдущий шаг Содержание Следующий шаг