Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тюмгу / Лекции КБ ИБАС 1 курс 2 семестр / лекция9 Безопасность 2018.pptx
Скачиваний:
14
Добавлен:
08.12.2019
Размер:
155.99 Кб
Скачать

Перегрузка методов

Перегруженные методы - методы

содинаковым именем, но различными аргументами

Концепция перегрузки метода позволяет определять в одном классе несколько различных методов

содним именем, но различными наборами формальных параметров и реализацией.

При компиляции программы компилятор

находит все одноименные методы и

выбирает тот их, чей набор формальных параметров совпадает с фактическими параметрами в вызове.

число фактических параметров в вызове = количеству формальных параметров в определении метода;

каждый фактический параметр имеет тип, совместимый

стипом соответствующего ему формального параметра.

1

Сигнатура метода

имя метода,

количество,

тип и порядок формальных параметров.

Как проверить, совпадают ли сигнатуры методов?

Пример 1. Поскольку возвращаемое значение (его тип) не входит в сигнатуру, следующие заголовки методов имеют одинаковую сигнатуру:

public int Sum (double x, double y);

public double Sum (double x, double y);

public void Sum (double x, double y);

2

Пример 2. В сигнатуре метода игнорируется ключевое слово params,

поэтому следующие заголовки соответствуют одной и той же сигнатуре:

public double Sum (double [] x);

public double Sum (params double [] x);

Пример 3. В сигнатуру метода не входят имена формальных параметров,

следовательно, заголовки методов имеют одинаковую сигнатуру:

public double Sum (double x, double y);

public double Sum (double a, double b);

3

Правило определения методов : все методы в классе должны иметь разные сигнатуры.

в одном классе можно определить несколько методов

с одним и тем же именем,

НО разными сигнатурами

Такие методы называются

перегруженными (overloading).

4

Неявные преобразования при использовании перегруженных методов

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

Правило 1. Если несколько перегруженных методов содержат формальные параметры, к типам которых могут быть неявно приведены фактические параметры, выбирается метод с типом, ближайшим к типу

фактического параметра в иерархии неявного приведения.

Например, тип sbyte неявно приводится к типу short, int, long, double, decimal.

5

6

Правило 2. Это правило связано с

неоднозначностью иерархии.

от типа long отходят две стрелки –

к float

к decimal

- значение типа long может быть неявно приведено к каждому из этих типов

- правило касается неоднозначных ситуаций:

есть два перегруженных метода, отличающихся типом формальных параметров - float и decimal.

Компилятор не сможет выбрать перегруженный метод, если при поиске неявного приведения будет достигнут тип

long или ulong.

Такой вызов метода считается неоднозначным и вызывает ошибку компиляции.

7

Правило 3. Мнимая неоднозначность:

по две стрелки отходят и от типов char, byte, ushort, uint.

это не приводит к неоднозначности, поскольку для неявного приведения типов действует следующий принцип:

если компилятор при поиске подходящего перегруженного метода находит две одинаково подходящих сигнатуры,

одну с параметром знакового целого типа,

а другую с соответствующим параметром

беззнакового целого типа,

то выбирается первая.

8

...

class myClass

{

public void myMethod (uint x)

{

...

}

public void myMethod (int a);

{

...

}

class myTest

{

myClass myObject = new myClass( );

byte k;

myObject.myMethod (k); //будет вызван второй метод

...

}

9

Использование ключевого слова this

При вызове любого метода экземпляра ему автоматически передается неявный фактический параметр,

параметр является ссылкой на вызывающий объект

это объект, для которого

вызван метод и

который передает методу данные.

Эта ссылка обозначается ключевым словом this (дословно – этот).

Со ссылкой можно применять операцию уточнения (точку) с последующим указанием члена класса.

10