Перегрузка методов — лекция по ооп
Лекция ООП
18,05,2015
Перегрузка методов.
Позволяет использовать одно имя для разных функций.
Примеры:
int max ( int x, int y)
{ if (x>y) return x;
return y; }
float max (float x, float y)
{if (x>y) return x; return y; }
Языки, реализующие перегрузку методов (функции, используют в качестве методов (функций) расширенные имена, которые как правило содержат информацию о типах формальных параметров.
Пример:
int x = 8; int y = 6;
f float z= 3 , u = -3;
int i;
float p;
i = max (x, y);
p = max (z, u);
p = max (x, y);
Рекомендуется при перегрузке функций под одним именем описывать функции, выполняющие сходные действия. Функции, имеющие одно и то же имя, должны отличаться или типом параметров, или их числом, или и тем и другим вместе.
Перегрузка оператора.
В С#, как и во многих языках, имеется готовый набор операторов, используемых для выполнения базовых операций над встроенными типами. Действия этих операторов можно определить и для объектов пользовательских типов. Такая возможность называется перегрузкой операторов. На перегрузку операторов накладываются некоторые ограничения:
1. Нельзя менять местность оператора.
2. Операторы сравнения (== и!=, < и >, <= и >=) перегружаются парами. [] – не перегружаются, но позволяют создать индексаторы. () – не может быть перегружен.
+= и -+ — не могут перегружаться, но они получаются автоматически при перегрузке соответствующей бинарной операции.
В С# для перегрузке операторов используется специальное слово operator, описывается специальный общедоступный статический метод, в заголовке которого есть это слово.
Пример:
class Money
{ private int rub;
private int kop;
public Money () {rub=0; kop=0; }
public Money (int z, int k) {rub=k%100; kop=r+k/100; }
public override string ToString () // метод ToString является виртуальным
{return rub. ToString() + “руб” + kop. ToString() + “коп”;} методом класс object (базовый для
всех типов в с#)
public static Money operator+(Money m1, Money m2)
{Money m3 = new Money ();
m3.kop = (m1.kop + m2.kop)%100;
m3.rub = m1.rub + m2.rub + (m1.kop + m2.kop)/100;
return m3;}
Money m1 = new Money (8,90);
Money m2 = new Money (6,70);
Money m3 = m1+m2;
textBox1.Text = m3.ToString(); } // ответ: 15 руб 60 коп
Поскольку тип возвращаемого значения operator + совпадает с типом самого класса, то мы можем использовать и записи следующего вида:
m3 = m1 + m1+ m2 + m3
Еще одно ограничение на перегрузку операторов:
В методе, который перегружает оператор, хотя бы один из параметров должен иметь тот ти, что и класс, в котором этот метод описан. Данное ограничение не позволяет перегружать операторы для объектов классов, с которыми мы не работаем.
Рассмотрим пример перегрузки одноместного оператора ++:
Дополним класс Money методом, перегружающим оператор ++
(пишется в описании класса)
public static Money operator++ (Money m)
{ m. rub ++; return m; }
После перегрузки оператора ++ мы можем написать : m3 = m1 ++ + m2;
Сначала изменится поле рубли объекта m1 (увеличено на единицу), затем сложение объектов m1 и m2 и ответ записан в объект m3.
Создание метода, принимающего разное число параметров.
Для того чтобы создать такой метод, нужно использовать служебное слово params.
Пример создания такого метода:
Рассмотри метод, который суммирует входные параметры.
int sum (params int [] m)
{int s=0;
for (int i=0; i<m. Length; i++)
S+= m[i];
return s;
}
Только один параметр может иметь метку params. Этот параметр должен быть записан в самом конце описания параметров.
x = sum(7, 8, 9, 10, -1, 10);
y = sum(1, x, 10);
int [] mas = int [6];
x = sum (mas);