Доступ к членам класса снаружи

Модификаторы доступа ограничивают только код за пределами класса, внутри класса изоляции доступа не существует.

Как мы разобрали ранее, внутри класса можно свободно обращаться ко всем его членам.

Далее мы изучим, как обращаться к членам класса извне.

Чтобы получить доступ к публичным членам экземпляра снаружи класса, необходимо использовать точечный синтаксис имяПеременнойОбъекта.имяЧлена.

class Program
{
    static void Main(string[] args)
    {
        Worker worker = new Worker(); // Создать объект
        int hours = worker.GetHours(); // Доступ к открытой функции через объект
        worker.hours = 12; // Присвоить значение открытой переменной через объект
        Console.WriteLine(worker.hours); // Читать напрямую как обычную переменную
    }
}

class Worker
{
    int age;
    private double savings;
    public int hours;

    void ReadSavings()
    {
        Console.WriteLine(savings);
    }

    public int GetHours()
    {
        return hours;
    }
}Code language: C# (cs)

Метод GetHours класса Worker помечен как public, поэтому его можно читать и изменять извне.

Метод Main класса Program создает объект Worker с именем worker.

Обращаться к открытым членам можно по имени объекта worker. Имя объекта работает подобно указателю, хранит ссылку (адрес в памяти), и через это имя с точкой . мы получаем доступ к открытым членам.

Формат доступа к членам экземпляра снаружи: переменнаяОбъекта.открытоеПоле / открытыйМетод().

Члены с модификатором private нельзя получить доступ через точечный синтаксис за пределами класса.

Если попытаться обратиться к закрытым членам (полям, функциям) снаружи класса, сразу возникнет ошибка.

Пример с ошибкой

class Program
{
    static void Main(string[] args)
    {
        Worker worker = new Worker(); 
        int hours = worker.GetHours(); 
        worker.hours = 12;
        Console.WriteLine(worker.hours);

        worker.ReadSavings();
        worker.age = 20;
        worker.savings = 1000000000.0;
    }
}

class Worker
{
    int age;
    private double savings;
    public int hours;

    void ReadSavings()
    {
        Console.WriteLine(savings);
    }

    public int GetHours()
    {
        return hours;
    }
}Code language: C# (cs)

Рассмотрим еще один пример

class Rectangle
{
    // Открытые поля экземпляра: длина Length, ширина Width
    public int Length, Width;

    // Метод экземпляра: вычисляет и возвращает площадь прямоугольника
    public int GetArea()
    {
        return Length * Width;
    }
}

class Program
{
    static void Main()
    {
        // Создать два независимых экземпляра прямоугольника
        Rectangle rect1 = new Rectangle();
        Rectangle rect2 = new Rectangle();

        // Присвоить длину и ширину каждому прямоугольнику отдельно; данные изолированы друг от друга
        rect1.Length = 10; rect1.Width = 5;
        rect2.Length = 8;  rect2.Width = 7;

        // Считать размеры, вызвать метод и вывести площадь
        Console.WriteLine("Прямоугольник 1: Длина {0}, Ширина {1}, Площадь {2}", rect1.Length, rect1.Width, rect1.GetArea());
        Console.WriteLine("Прямоугольник 2: Длина {0}, Ширина {1}, Площадь {2}", rect2.Length, rect2.Width, rect2.GetArea());
    }
}Code language: C# (cs)

Это класс прямоугольника. У него два открытых поля Length и Width для хранения длины и ширины, а также функция GetArea, возвращающая площадь фигуры.

Все эти члены являются открытыми.

Результат выполнения

Прямоугольник 1: Длина 10, Ширина 5, Площадь 50
Прямоугольник 2: Длина 8, Ширина 7, Площадь 56

В памяти данные хранятся так

Два объекта хранятся независимо. У каждого свой Length и Width, они не влияют друг на друга.

Доступ к членам класса снаружи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *