Мне задали этот вопрос в одном из моих интервью, но я не смог выяснить, почему именно этого понятия нет.
Пожалуйста, дай мне знать.
Мне задали этот вопрос в одном из моих интервью, но я не смог выяснить, почему именно этого понятия нет.
Пожалуйста, дай мне знать.
Он не встроен в язык, потому что нет разумной реализации по умолчанию.
Конструкторы копирования страдают от многих из тех же неясностей, что и клонирование. Например, хотите ли вы сделать поверхностную или глубокую копию, зависит от ваших конкретных обстоятельств.
Скажем, у вас есть класс Order
со свойством Customer
. Должен ли его конструктор копирования создавать нового клиента или указывать на исходный экземпляр? Наверное оригинальный экземпляр - а как же Order.Payment
?
Хуже того, даже когда вы решите выполнить глубокую копию, вы даже не сможете создать все свои подчиненные объекты, потому что их конструкторы (или аналогичные фабричные методы) могут быть недоступны.
Если этого недостаточно, эта статья о проблемах проектирования Java освещает некоторые другие проблемы (например, усечение типа).
Каким образом C# не поддерживает идею конструктора копирования? Вы более чем свободны создать тот, который копирует так глубоко, как вам нравится.
Не так ли?
class Foo
{
public Foo (Foo other) // copy ctor
{ ... }
}
Но, возможно, я немного подзабыл, какие другие правила применяются в C++ (где был придуман термин копирующий конструктор).