Что такое перегрузка конструктора

Перегрузка конструкторов

Как и методы, конструкторы также могут перегружаться. Это дает возможность конструировать объекты самыми разными способами:

Одна из самых распространенных причин для перегрузки конструкторов заключается в необходимости предоставить возможность одним объектам инициализировать другие, наподобие того, как в предыдущем примере инициализируются поля класса.

Когда приходится работать с перегружаемыми конструкторами, то иногда очень полезно предоставить возможность одному конструктору вызывать другой. В C# это дается с помощью ключевого слова this. Ниже приведена общая форма такого вызова:

В исходном конструкторе сначала выполняется перегружаемый конструктор, список параметров которого соответствует критерию список_параметров2, а затем все остальные операторы, если таковые имеются в исходном конструкторе. Ниже приведен соответствующий пример:

Что такое перегрузка конструктора. Смотреть фото Что такое перегрузка конструктора. Смотреть картинку Что такое перегрузка конструктора. Картинка про Что такое перегрузка конструктора. Фото Что такое перегрузка конструктора

Вызывать перегружаемый конструктор с помощью ключевого слова this полезно, в частности, потому, что он позволяет исключить ненужное дублирование кода. В приведенном выше примере нет никакой необходимости дублировать во всех трех конструкторах одну и ту же последовательность инициализации, и благодаря применению ключевого слова this такое дублирование исключается. Другое преимущество организации подобного вызова перегружаемого конструктора заключается в возможности создавать конструкторы с задаваемыми «по умолчанию» аргументами, когда эти аргументы не указаны явно.

Источник

Перегрузка конструкторов

Хотя конструкторы и предназначены для решения особо важных задач, они мало чем отличаются от обычных функций и могут быть перегружены. Как было показано ранее, для перегрузки конструктора класса достаточно просто объявить различные его формы. Как будет показано далее, во многих случаях перегрузка конструкторов позволяет до­биться определенных преимуществ.

Начнем с примера. В следующей программе объявляется класс timer, действующий как таймер обратного отсчета. При создании объекта типа timer ему присваивается начальное значение вре­мени. В результате вызова функции run() таймер начинает отсчет в сторону уменьшающихся зна­чений, пока не достигнет значения 0, после чего зазвонит звонок. В данном примере конструк­тор перегружен для того, чтобы можно было указывать время в секундах с помощью целого числа или строки, или в минутах и секундах, если указываются два целых числа.

Эта программа использует библиотечную функцию clock(), возвращающую число тиков, про­шедших с момента запуска программы. Поделив это значение на макрос CLK_TCK, получаем значение в секундах. Прототипы для clock() и CLK_TCK содержатся в заголовочном файле time.h.

#include
#include
#include
class timer <
int seconds;
public:
/ / секунды задаются строкой
timer(char *t) < seconds = atoi(t); >
// секунды задаются целым числом
timer (int t) < seconds = t; >
// время задается в минутах и секундах
timer (int min, int sec) < seconds = min*60 + sec; >
void run();
>;
void timer::run()
<
clock_t t1, t2;
t1 = t2 = clock () /CLK_TCK;
while (seconds) <
if (t1/CLK_TCK+1

Источник

ООП. Часть 4. Полиморфизм, перегрузка методов и операторов

C# позволяет использовать один метод для разных типов данных и даже переопределить логику операторов. Разбираемся в перегрузках.

Что такое перегрузка конструктора. Смотреть фото Что такое перегрузка конструктора. Смотреть картинку Что такое перегрузка конструктора. Картинка про Что такое перегрузка конструктора. Фото Что такое перегрузка конструктора

Что такое перегрузка конструктора. Смотреть фото Что такое перегрузка конструктора. Смотреть картинку Что такое перегрузка конструктора. Картинка про Что такое перегрузка конструктора. Фото Что такое перегрузка конструктора

Полиморфизм (от греч. poly — много и morphe — форма) — один из главных столпов объектно-ориентированного программирования. Его суть заключается в том, что один фрагмент кода может работать с разными типами данных.

В C# это реализуется с помощью перегрузок (overloading).

Все статьи про ООП

Что такое перегрузка конструктора. Смотреть фото Что такое перегрузка конструктора. Смотреть картинку Что такое перегрузка конструктора. Картинка про Что такое перегрузка конструктора. Фото Что такое перегрузка конструктора

Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.

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

C# — строго типизированный язык. Это значит, что вы не можете поместить строку в переменную типа int — сначала нужно провести преобразование. Так же и в метод нельзя передать параметр типа float, если при объявлении метода был указан тип double.

Однако если вы экспериментировали с методом WriteLine() класса Console, то могли заметить, что в него можно передавать аргументы разных типов:

Кажется, что нарушена типизация, но компилятор не выдаёт ошибку. Вместо этого всё успешно выводится на экран:

Что такое перегрузка конструктора. Смотреть фото Что такое перегрузка конструктора. Смотреть картинку Что такое перегрузка конструктора. Картинка про Что такое перегрузка конструктора. Фото Что такое перегрузка конструктора

Так происходит потому, что у метода WriteLine() есть перегрузки — методы с таким же названием, но принимающие другие аргументы:

Когда вы вызовете метод Sum(), компилятор по переданным аргументам узнает, какую из его перегрузок вы имели в виду — так же, как это происходит с методом WriteLine().

При этом стоит учитывать, что значение имеют только типы и количество передаваемых аргументов. Например, можно написать такие перегрузки:

У этих методов одинаковые параметры, но разный возвращаемый тип. Попытка скомпилировать такой код приведёт к ошибке — так же, как и создание перегрузки с такими же аргументами, но с другими названиями:

Перегрузка конструкторов

То же самое можно сделать и с конструкторами классов:

Альтернатива этому решению — указать значения для аргументов по умолчанию:

Несмотря на, то что здесь меньше кода, на мой взгляд, это может запутать. Потому что придётся каждый раз заполнять все значения, даже если нужен только один аргумент из конца списка. Перегрузка же позволяет определить и порядок параметров (если они разных типов).

Перегрузка операторов

Перегрузить можно даже операторы, то есть:

Так как использоваться этот оператор должен без объявления экземпляра класса (item1 + item2, а не item1 item1.+ item2), то указываются модификаторы public static.

Например, мы хотим улучшать предметы в играх. Во многих MMO 1 популярна механика, когда один предмет улучшается за счёт другого. Мы можем сделать это с помощью перегрузки оператора сложения:

Теперь при сложении двух объектов класса Item мы будем получать третий объект с улучшенными параметрами. Вот пример использования такого оператора:

В результате в консоль будет выведено следующее:

Что такое перегрузка конструктора. Смотреть фото Что такое перегрузка конструктора. Смотреть картинку Что такое перегрузка конструктора. Картинка про Что такое перегрузка конструктора. Фото Что такое перегрузка конструктора

1) MMO (англ. Massively Multiplayer Online Game, MMO, MMOG)

Массовая многопользовательская онлайн-игра

Перегрузка операторов преобразования типов

Хотя типизация в C# строгая, типы можно преобразовывать. Например, мы можем конвертировать число типа float в число типа int:

С помощью перегрузки операторов преобразования типов мы можем прописать любую логику для конвертации объектов. Для наглядности создадим класс Hero:

В этом классе хранятся данные о персонаже. В MMO часто можно увидеть такой параметр, как мощь — это сумма всех характеристик героя или предмета. Например, её можно посчитать по следующей формуле:

Мощь = (сила + ловкость + интеллект) * уровень.

Мы можем использовать преобразование типов, чтобы автоматически переводить объект в его мощь. Для этого нужно использовать такую конструкцию.

Модификатор implicit говорит компилятору, что преобразование может быть неявным. То есть оно сработает, если написать так:

Explicit, наоборот, означает, что преобразование должно быть явным:

Вот как будет выглядеть перегрузка преобразования объекта класса Hero в int:

Вот как она будет использоваться:

Вывод в консоль будет следующим:

Что такое перегрузка конструктора. Смотреть фото Что такое перегрузка конструктора. Смотреть картинку Что такое перегрузка конструктора. Картинка про Что такое перегрузка конструктора. Фото Что такое перегрузка конструктора

Проблемы читаемости

Несмотря на то, что перегрузки помогают быстро реализовать какой-нибудь функционал, они могут навредить читаемости. Например, не всегда можно сразу понять, зачем в коде складываются два объекта.

Или же непонятно, зачем конвертировать Hero в int. Ясность вносит название переменной (power), но этого недостаточно.

В большинстве случаев лучше использовать более простые решения. Например, можно создать для объекта свойство Power, которое возвращает сумму характеристик.

Вместо сложения объектов можно написать метод Enhance(), который будет принимать другой предмет и прибавлять его характеристики к текущему.

Такие перегрузки стоит использовать либо если вы работаете над кодом один, либо если есть подробная документация.

Домашнее задание

Создайте игру, в которой можно улучшать одни предметы с помощью других. При улучшении предмету добавляется опыт. Когда его станет достаточно, необходимо повысить уровень. Количество опыта должно зависеть от мощи.

Заключение

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

Вы можете изучить ООП гораздо глубже, записавшись на курс «Профессия C#-разработчик». Он раскрывает лучшие практики работы с C# в объектно-ориентированной парадигме программирования.

Источник

Русские Блоги

16. Перегрузка конструктора и метода.

1. Разница между конструктором и обычной функцией.

1. Вызываемые во время создания экземпляра, обычные функции вызываются непосредственно через класс или через объект.

2. Отличие конструктора от обычной функции.

1. Конструктор не возвращает значение
2. Имя конструктора может совпадать только с именем класса.
3. Его можно вызвать только во время создания экземпляра (то есть его можно использовать только после ключевого слова new).

В-третьих, связь между классом и конструктором.

Вызов конструктора создаст экземпляр объекта этого класса.

Четыре, нестандартный конструктор.

Конструктор по умолчанию

Пользовательский конструктор:
Пользовательский конструктор заменит конструктор по умолчанию.

Пять, это ключевое слово

Используемый в этом объекте, он представляет этот объект.
Случай:

Пять, перегрузка метода

1. Условием построения перегрузки метода является то, что имя функции совпадает, а порядок, тип и количество параметров с разными типами данных будут составлять перегрузку.

Шесть, перегрузка конструктора

1. Условие, составляющее перегрузку конструктора, заключается в том, что имя функции совпадает, а порядок, тип и количество параметров с разными типами данных будут представлять собой перегрузку.

Упражнение 1 класса:

Будет ли проблема со следующим кодом? Если есть проблема, в чем проблема?

Упражнение 2 класса:

Что __________ будет напечатано в следующем коде.

Источник

Перегруженный конструктор класса

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

Например: один из конструкторов не принимает параметры, второй принимает два параметра, третий принимает три параметра. Позже, во время создания объекта, параметры передаются в качестве аргументов. Так компилятор сможет определить, какой из объявленных конструкторов применить при создании объекта.

Что такое перегрузка конструктора. Смотреть фото Что такое перегрузка конструктора. Смотреть картинку Что такое перегрузка конструктора. Картинка про Что такое перегрузка конструктора. Фото Что такое перегрузка конструктораНа этом примере достаточно легко увидеть, чем вызвана необходимость перегрузки конструкторов. Основной смысл в том, чтобы дать возможность программисту выбрать наиболее подходящий способ инициализации объекта.

Тут представлен самый распространенный вариант перегрузки конструкторов. А именно конструктор с параметрами и второй без параметров. Часто, программисту бывают необходимы оба подобных конструктора, так как конструктор с параметрами удобно использовать, работая с одиночными объектами. Но он не может быть использован, например, для инициализации динамического массива объектов класса.

При каждом объявлении объекта класса надо применять соответствующий определённым конструкторам способ объявления.

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

Хочется добавить, что деструктор, в отличии от конструктора, перегружен быть не может, так как он никаких параметров не принимает.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *