
- •Вопрос 1 Классы обзор элементов класса.
- •Обзор элементов класса.
- •Вопрос 2 Методы. Синтаксический блок. Ссылочные параметры ref и out
- •Объявление методов
- •Возврат из метода и возврат значения
- •Вопрос 3 Перегрузка методов. Перегрузка методов. Вызов методов с одинаковым именем и разными аргументами
- •Вопрос 4 Переменное число аргументов метода params. Переменное число аргументов метода
- •Вопрос 5 Ссылочные параметры ref и out сравнительный анализ.
- •Вопрос 6 Конструкторы. Виды конструкторов, области применения, синтаксический блок.
- •Вызов конструктора экземпляра
- •Закрытые конструкторы экземпляра
- •Статические конструкторы
- •Конструкторы структур
- •Вопрос 7 Свойства. Область применения. Синтаксический блок.
- •Вопрос 8 Наследование. Предпосылки появления. Типы наследования. Синтаксический блок.
- •Вопрос 9 Виртуальные функции virtual. Вызов базовых версий функций base.
- •Вызов базовых версий функций
- •Вопрос 10 Наследование. Динамическое связывание.
- •Вопрос 11 Абстрактные методы. Особенности применения. Синтаксический блок
- •Абстрактный метод в c#
- •Вопрос 12 Абстрактные классы. Синтаксический блок. Особенности.
- •Вопрос 13 Полиморфизм как концепция ооп.
- •Вопрос 14 Потеря и восстановление информации о типе. Операторы is и as.
- •Вопрос 15 Множественное наследование. Интерфейсы область применения. Синтаксический блок.
- •Вопрос 16 Делегаты. Область применения. Синтаксический блок.
- •Вопрос 17 Групповые делегаты. Область применения. Особенности синтаксиса.
- •Вопрос 18 События. Область применения. Синтаксический блок.
- •Вопрос 19 Исключения. Область применения синтаксический блок.
- •Вопрос 20 Потоки данных и файловый ввод-вывод. Виды файлов.
- •Вопрос 21 Класс fileinfo. Обзор элементов класса.
- •Вопрос 22 Классы StreamReader и StreamWriter. Обзор элементов класса.
- •Вопрос 23 Класс List. Особенности применения. Методы и свойства класса.
- •Вопрос 24 Класс StringBuilder. Особенности применения и методы.
- •Вопрос 25 Бинарный ввод и вывод при помощи класса FileStream.
- •Вопрос 26 Форма как базовый элемент графического интерфейса. Заголовок, первоначальное размещение, свойства BackColor, ForeColor, Font; Cursor; BackGroundImage.
- •Вопрос 27 Форма как базовый элемент графического интерфейса. Рамка для формы. Кнопки изменения размеров формы. Прозрачность.
- •Вопрос 28 Передача фокуса ввода на форме. Свойства TabStop TabIndex.
- •Вопрос 29 Текстовые поля. Элемент управления Label и TextBox. Сравнительный анализ.
- •Вопрос 30 Элемент управления MenuStrip.
- •Вопрос 33
- •Вопрос 35 Элементы управления NumericUpDown и DomainUpDown характеристика и сравнительный анализ.
- •Вопрос 36 Вложенные элементы управления(контейнеры) TabControl и GroupBox. Применение элементов управления GroupBox и Panel
- •Применение элемента управления TabControl
- •Вопрос 37 Стыковка и фиксация элементов управления. Свойства Anchor и Dock.
- •Вопрос 38 Методы формы. Show, ShowDialog, Activate, Hide, Close. Методы Show и ShowDialog
- •Метод Activate
- •Метод Hide
- •Метод Close
- •Вопрос 42 Оповещение пользователя об ошибках ввода ErrorProvider.
Вопрос 3 Перегрузка методов. Перегрузка методов. Вызов методов с одинаковым именем и разными аргументами
Для
того чтобы лучше понять, что такое
перегрузка методов необходимо рассмотреть
пример вычисления расстояния между
двумя точками на плоскости. Предположим,
что на плоскости расположены две точки
с координатами:
и
.
Воспользовавшись простейшим правилом
геометрии расстояние между этими точками
будет равно:
Ниже
представлен код программы.
Предположим, что нам необходимо написать программу вычисляющую значение длинны отрезка с параметрами типа int. Код будет выглядеть следующим образом:
class Plane
{
…
public double DistanceInt(int x1, int yl, int x2, int y2)
{
return Math.Sqrt(Math.Pow(x1-x2,2) + Math.Pow(y1-y2. 2));
}
…
}
Список формальных параметров метода DistanceInt содержит четыре значения типа int(или неявно преобразуемого в него). Однако если потребуется найти расстояние для четырех аргументов типа double , будет необходимо создать другой метод класса Plane, DistanceDouble, который выглядит следующим образом:
class Plane
{
…
public double DistanceDouble(double x1, double yl, double x2, double y2)
{
return
Math.Sqrt(Math.Pow(x1-x2,2) + Math.Pow(y1-y2. 2));
}
…
}
Возможен
еще и другой случай, когда для представления
точек на плоскости используется некий
класс Point.
Каждый объект этого класса содержит
две закрытые переменные экземпляра
.
Для доступа к ним применяются
соответствующие методы (асессор и
мутатор).
class Point
{
private int x = 0;
private int y = 0;
public void setX(int newX)
{
x = newX;
}
public void setY(int newY)
{
y=newY;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
}
Теперь для расчета расстояния (с помощью методов созданных ранее) удобнее указать четыре числовых аргумента и два объекта :
public double DistanceObjects(location L1, location L2)
return
Math.Sqrt(Math.Pow(L1.getX()-L2.getX(),2)+Math.Pow(L1.getY() - L2.getY(),2));
}
Из написанных кодов можно сделать следующий вывод, что три метода с разными именами, по существу, решают одну задачу — вычисляют расстояние. Разумеется, было бы проще и естественнее (независимо от типа аргументов — int, double или Location) использовать одно имя Distance.
При этом компилятор автоматически выбирает правильный путь для обработки аргументов. Такой подход возможен благодаря перегрузке метода.
Эта концепция позволяет определять в одном классе несколько различных методов с одним именем, но разными наборами формальных параметров и реализацией. Для перегрузки метода в данном случае (чтобы три приведенных вызова были корректными вместе с возвращаемыми ими значениями) достаточно просто присвоить всем трем методам одно имя — Distance. Тело каждого из них останется без изменений, а заголовки будут выглядеть так:
public double Distance(int x1, int y1, int х2, int y2)
public double Distance{double x1, double yl. double x2, double y2)
public double Distance(Location LI, Location L2)
Теперь, когда компилятор встречает оператор Plane.Distance(10, 10, 20, 30), он совершает следующие действия. Вначале в классе Plane производится поиск метода с именем Distance. Компилятор находит три таких метода. Он выбирает тот из них, чей набор формальных параметров совпадает с аргументами в вызове. Такое совпадение требует, чтобы:
Число аргументов в вызове было равно числу формальных параметров.
Каждый аргумент имеет тип, совместимый с типом соответствующего ему формального параметра.
Следуя этой процедуре, компилятор выбирает метод Distance с заголовком:
public double Distance(int x1, int у1, int х2, int y2) С перегрузкой метода связана важная концепция — сигнатура метода. Имя метода вместе с числовым типом и порядком формальных параметров составляют сигнатуру метода.
Однако стоит отметить следующие исключения.
Возвращаемое значение не включено в сигнатуру метода. Таким образом, следующие три заголовка имеют одинаковую сигнатуру (несмотря на то, что первый возвращает значение double, второй int, а третий не возвращает значения):
public double Sum (double a, double b)
public int Sum (double a, double b)
public void Sum (double a, double b)
Ключевое слово params в сигнатуре метода игнорируется. Следовательно, следующие два заголовка имеют одинаковую сигнатуру:
public double Sum (params double[] numbers)
public double Sum (double[] numbers)
Имена формальных параметров не включаются в сигнатуру метода. Сигнатуры двух следующих методов совпадают:
public int Sum (double x, double y)
public int Sum (double a, double b)
Все методы в классе должны иметь разные сигнатуры. Поскольку имя метода — один из нескольких атрибутов, определяющих сигнатуру метода, в одном классе можно определить несколько методов с одним именем при условии, что остальные элементы сигнатур различаются. Такие методы называются перегруженными,
Перегруженные методы широко используются в классах .NET.
Рассмотрим, как согласуется перегрузка методов и неявное преобразование.