
- •Перегрузка методов
- •Сигнатура метода
- •Пример 2. В сигнатуре метода игнорируется ключевое слово params,
- •Правило определения методов : все методы в классе должны иметь разные сигнатуры.
- •Неявные преобразования при использовании перегруженных методов
- •Правило 2. Это правило связано с
- •Правило 3. Мнимая неоднозначность:
- •Использование ключевого слова this
- •Во многих случаях можно обойтись без этой ссылки
- •Пример 2.
- •class MyData
- •public MyData GetMoreHigh (MyData aData)
- •class Test
- •Конструкторы
- •НО в большинстве случаев не используют автоинициализацию :
- •Подобный подход к инициализации не подходит, например,
- •Определение конструктора
- •Идентификатор конструктора class_name
- •Конструктор с пустым списком формальных параметров называется конструктором по умолчанию.
- •Вызов конструктора
- •правая часть конструкции – это оператор new для создания экземпляра класса.
- •Деструкторы
- •суть механизма СМ (GC):
- •Cлучаи, когда объект становится недоступным:
- •Сборка мусора решает две основные задачи:
- •Такой прием используется, чтобы
- •!! отсутствует
- •Алгоритм использования деструкторов
- •По завершении поиска недоступных объектов выполняются коды деструкторов отобранных объектов.
- •При этом объекты не только
- •using System;
- •//создание объекта, локализованного в методе

Перегрузка методов
Перегруженные методы - методы
содинаковым именем, но различными аргументами
Концепция перегрузки метода позволяет определять в одном классе несколько различных методов
содним именем, но различными наборами формальных параметров и реализацией.
При компиляции программы компилятор
находит все одноименные методы и
выбирает тот их, чей набор формальных параметров совпадает с фактическими параметрами в вызове.
число фактических параметров в вызове = количеству формальных параметров в определении метода;
каждый фактический параметр имеет тип, совместимый
стипом соответствующего ему формального параметра.
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