Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
теория ООП .doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
199.17 Кб
Скачать

Int beta; // Спецификатор private по умолчанию,

public int gamma; // Явно задан спецификатор public.

/* Методы для получения доступа к членам alpha и beta.

*/

public void setAlpha(int a) {

alpha = а;

}

public int getAlpha() {

return alpha;

}

public void setBeta(int a) {

beta = a;

}

public int getBetaO {

return beta;

}

class AccessDemo {

public static void Main() {

MyClass ob = new MyClass();

/* Доступ к private-членам alpha и beta разрешен

только посредством соответствующих методов. */

ob.setAlpha(-99);

ob.setBeta(19);

Console.WriteLine("Член ob.alpha равен " +

ob.getAlpha());

Console.WriteLine("Член ob.beta равен " +

ob. getBetaO ) ;

// К private-членам alpha или beta нельзя получить

// доступ таким образом:

// ob.alpha = 10; // Неверно! alpha -- закрытый член!

// ob.beta = 9 ; // Неверно! beta -- закрытый член!

// Можно получить прямой доступ

//к члену gamma, поскольку он открытый член.

ob.gamma = 99;}}

Полиморфизм. Полиморфизм – это инструмент, который дает возможность создавать множественные определения для операций и функций. А какое именно определение будет использоваться, зависит от контекста программы.

В С# два или больше методов внутри одного класса могут иметь одинаковое имя, но при условии, что их параметры будут различными. Такую ситуацию называют перегрузкой методов (method overloading), а методы, которые в ней задействованы, — перегруженными (overloaded). Перегрузка методов — один из способов реализации полиморфизма в С#.

В общем случае для создания перегрузки некоторого метода достаточно объявить еще одну его версию. Об остальном позаботится компилятор. Но здесь необходимо отметить одно важное условие: все перегруженные методы должны иметь списки параметров, которые отличаются по типу и/или количеству. Методам для перегрузки недостаточно отличаться лишь типами возвращаемых значений. Они должны отличаться типами или числом параметров. (Другими словами, тип возвращаемого значения не обеспечивает достаточную информацию для С#, чтобы можно решить, какой именно метод должен быть вызван.) Конечно, перегруженные методы могут отличаться и типами возвращаемых значений. При вызове перегруженного метода выполняется та его версия, параметры которой совпадают (по типу и количеству) с заданными аргументами.

Вот простой пример, иллюстрирующий перегрузку методов:

// Демонстрация перегрузки методов.

using System;

class Overload {

public void ovlDemo() {

Console.WriteLine("Без параметров");

}

// Перегружаем метод ovlDemo() для одного

// целочисленного параметра,

public void ovlDemo(int a) {

Console.WriteLine("Один параметр: " + a);

}

// Перегружаем метод ovlDemo() для двух

// целочисленных параметров,

public int ovlDemo(int a, int b) {

Console.WriteLine("Два int-параметра: " + a + " " + b);

return a + b;

// Перегружаем метод ovlDemo() для двух

// double-параметров.

public double ovlDemo(double a, double b) {

Console.WriteLine("Два double-параметра: " +

a + " "+ b ) ;

return a + b;

class OverloadDemo {

public static void Main() {

Overload ob = new OverloadO;

int resl;

double resD;

// Вызываем все версии метода ovlDemo().

ob.ovlDemo();

Console.WriteLine();

ob.ovlDemo(2);

Console.WriteLine();

resl = ob.ovlDemo(4, 6);

Console.WriteLine("Результат вызова ob.ovlDemo(4, 6):

+ resl);

Console.WriteLine();

resD = ob.ovlDemo(1.1, 2.32);

Console.WriteLine(

"Результат вызова ob.ovlDemo(1.1, 2.2):

resD);

Программа генерирует следующие результаты:

Без параметров

Один параметр: 2

Два int-параметра: 4 б

Результат вызова ob.ovlDemo(4, б): 10

Два double-параметра: 1.1 2.32

Результат вызова ob.ovlDemo(I.1, 2.2): 3.42

Как видите, метод ovlDemo () перегружается четыре раза. Первая версия вообще не принимает параметров, вторая принимает один целочисленный параметр, третья — два целочисленных параметра, а четвертая — два double-параметра. Обратите внимание на то, что первые две версии метода ovlDemo () возвращают тип void, т.е. не возвращают никакого значения, а вторые две возвращают значения соответствующих типов. Это вполне допустимо, но, как уже разъяснялось, перегрузка методов не достигается различием только в типе возвращаемого значения. Поэтому попытка использовать следующие две версии метода ovlDemo () приведет к ошибке:

// Одно объявление метода ovlDemo(int) вполне допустимо,

public void ovlDemo(int a) {

Console.WriteLine("Один параметр: " + a ) ;

}