Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка - Основи Програмування C_.doc
Скачиваний:
46
Добавлен:
18.12.2018
Размер:
1.44 Mб
Скачать

3. Методи з параметрами.

У прикладах класів створені нами методи мали порожній список параметрів, хоча за синтаксисом будь-який метод може використовувати параметри, які дозволяють йому спілкуватись з іншими частинами програми, зокрема, одержуючи необхідну для роботи вхідну інформацію або навпаки – повертаючи оброблену інформацію. Детальну розмову про використання параметрів у функціях матимемо пізніше, а зараз зауважимо, що у більшості звертань до методів С# ми використовували параметри: наприклад, звертаючись до методів Console.WriteLine або Math.Cos чи Math.Sin, ми записували у дужках аргументи для їх виклику. Спробуємо наділити наші методи класів параметрами.

Перш за все, нагадаємо (про це згадувалось вище), що передача аргументів у функції може відбуватись двома способами: за значенням (call-by-value) або за посиланням (call-by-reference). У першому випадку для аргументу, що передається у функцію, у стеку створюється копія, в яку записується значення аргументу. Таким чином, функція може використовувати значення аргументу, проте не має можливості вплинути на оригінал. У другому випадку функція одержує посилання на місце розташування аргументу у пам’яті, тому зміни у функції цього аргументу призводять до реального впливу на нього.

Ситуація дещо ускладнюється, коли у функцію передається змінна-посилання, яка вже сама містить адресу певного об’єкту, розміщеного у динамічній пам’яті (наприклад, масиву). Якщо змінна-посилання сама передається за посиланням, то ми можемо як змінити об’єкт, на який вказує ця змінна, так і змінити саму змінну-посилання (наприклад, «переставити» її на інший об’єкт або перетворити її значення на null), як цього і слід було чекати. Проте, якщо змінна-посилання передається у функцію за значенням, то функція має справу з копією посилання – тобто не може вплинути на оригінал самого посилання, але має прямий доступ до об’єкта або значення, на яке вказує посилання, а отже, може змінювати цей об’єкт або значення. Якщо у функцію передається аргумент, що за своєю природою має reference-тип, зрозуміло, що це передача за посиланням, адже функція одержує адресну змінну, отже, має доступ до самого аргументу. Якщо ж у функцію передається аргумент value-типу, то він потрапляє у неї за значенням (насправді існує можливість передати його і в інший спосіб). У списку параметрів декларації функції вони перелічуються через кому із вказанням типу кожного з параметрів.

У наступному прикладі метод класу має три параметри дійсного, цілого та символьного типів, які використовуються для ініціалізації даних членів цього класу.

using System;

namespace Param_Metod

{

class OurClass

{

double x; // Всі дані-члени цього класу - закриті!

int i;

char c;

// Відкритий метод для ініціалізції закритих даних класу

// x_, i_, c_ - параметри методу OurMetod

public void OurMetod(double x_, int i_, char c_)

{

x = x_;

i = i_;

c = c_;

}

public double Get_x()

{ return x; }

public int Get_i()

{ return i; }

public char Get_c()

{ return c; }

}

class Program

{

static void Main()

{

OurClass cl = new OurClass();

cl.x = 1; // Помилка: x – закритий член класу

cl.i = 1; // Помилка: i - закритий член класу

cl.c = 'A'; // Помилка: c - закритий член класу

// Ініціалізуємо закриті члени класу:

// Аргументи 1, 1, 'A' копіюються у x_, i_, c_

cl.OurMetod(1, 1, 'A');

Console.WriteLine("x = {0} i = {1} c = {2}",

cl.Get_x(), cl.Get_i(), cl.Get_c ());

}

}

}

В цьому прикладі класс OurClass містить 3 члени класу, які не специфіковані, а отже, мають специфікацію private за замовчуванням. Тому спроба звернутись до цих змінних зовні спричинить помилку (закритий коментарем рядок cl.x = 1; і наступні за ним). Доступ до таких членів класу можливий лише через відкритий метод цього ж класу. У прикладі в цій ролі виступає функція OurMetod. Її список включає 3 параметри x_ типу double, i_ типу int, та c_ типу char. У виклику цього методу cl.OurMetod(1, 1, 'A') вказані відповідно аргументи 1, 1, 'A'. Кожен з них копіюється у нову змінну, створену в момент виклику методу у стеку, у строгій відповідності до порядку формальних параметрів у списку функції OurMetod. Решта методів класу OurClass необхідна, оскільки вони повертають значення закритих членів класу, тобто дають змогу зовнішнім функціям користуватись цими значеннями, проте не дають змоги змінити самі члени класу.

Те, що ми зробили в даному прикладі, є першим наближенням до реалізації механізму інкапсуляції даних у класах – дані захищені, а їх значення можуть використовуватись завдяки відкритим методам класу. В ідеалі всі дані-члени класу мають бути організовані із специфікацією private, щоб запобігти їх пошкодженню зовні і повністю контролювати доступ до них.