Интересно, могу ли я сказать, что конструктор является частным случаем метода ?
Могу ли я сказать, что конструктор - это метод?
Ответ 1
Вы можете сказать что угодно. Кто-то будет не согласен с вами, зависит от контекста. Некоторые языковые сообщества и стандарты определяют это таким образом.
Более тщательно, это зависит от того, что вы подразумеваете под "методом". Например, в С++ одним из способов анализа процесса создания является то, что он состоит из вызова оператора new (возможно, просто размещения), за которым следует вызов метода конструктора. С точки зрения реализации, конструктор выглядит, ходит, и крякает, как метод. В некоторых компиляторах вы можете даже явно вызвать один из них.
С более теоретической точки зрения, кто-то может утверждать, что конструкторы - некоторые отличительные виды. Однако нет единой, истинной, привилегированной концептуальной модели методов, конструкторов или фиолетовых единорогов.
Гош, это все субъективно.
Ответ 2
Вы могли бы так сказать, так же, как вы можете сказать, что человек является особым случаем животного, однако в большинстве случаев упоминание животных подразумевает нечеловеческих животных и упоминание методы подразумевают неконструкторские методы.
Ответ 3
Технически, конструктор обычно метод. Независимо от того, действительно ли это или нет, во многом зависит от конкретной среды. Например, в конструкторах .NET методы называются фактически после создания объекта. Тем не менее, также возможно создать объект, не имеющий конструктора, который вызывается сразу после.
Обновление: Что касается .NET или Common Language Infrastructure, точнее, ECMA 335, раздел 8.9.6.6 Конструкторы заявляют:
Новые значения типа объекта создаются с помощью конструкторов. Конструкторы должны быть методами экземпляра, определенными с помощью специальной формы контракта метода, которая определяет контракт метода как конструктор для определенного типа объекта.
Ответ 4
В языках, имеющих конструкторы, вы обычно можете рассматривать конструктор как частный случай метода factory. (Обратите внимание: я не имею в виду шаблон проектирования программного обеспечения метода GoF factory, я просто говорю о любом методе класса, который создает новые экземпляры.) Обычно этот "специальный корпус" обычно принимает форму раздражающих ограничений (например, в Java, вы можете вызывать только родительский конструктор в начале конструктора), поэтому даже на языках, которые имеют конструкторы, вы часто в конечном итоге используете или записываете методы factory.
Итак, если конструкторы в основном представляют собой методы factory с ограничениями, им действительно не нужно иметь их обоих, и поэтому многие языки просто избавляются от конструкторов. Примеры включают Objective-C, Ruby, Smalltalk, Self, Newspeak, ECMAScript/JavaScript, Io, Ioke, Seph и многие другие.
В Ruby самым близким к конструктору является метод Class#allocate
, который просто выделяет пустой объект и устанавливает этот класс объекта указатель. Больше ничего. Поскольку такой пустой объект, очевидно, непригоден, его необходимо инициализировать. По соглашению эта инициализация выполняется с помощью #initialize
. Для удобства, потому что очень важно помнить, как выделять и инициализировать (как может показаться любой разработчик Objective-C), есть вспомогательный метод под названием Class#new
, который выглядит примерно так:
class Class
def new(*args, &block)
obj = allocate
obj.initialize(*args, &block)
return obj
end
end
Это позволяет заменить это:
foo = Foo.allocate
foo.initialize(bar)
При этом:
foo = Foo.new(bar)
Важно отметить, что нет ничего особенного ни в одном из этих методов. Ну, за одним исключением: Class#allocate
, очевидно, должен иметь возможность устанавливать указатель на класс и выделять память, что невозможно в Ruby. Таким образом, этот метод должен каким-то образом прийти извне системы, которая, например, в MRI означает, что он написан на C, а не в Ruby. Но это касается только реализации. Нет специальных правил отправки, никаких специальных правил переопределения. Это просто метод, подобный любому другому, который может, например, звоните super
каждый раз, когда и как часто он хочет и может вернуть то, что он хочет.
Ответ 5
Я думаю, что конструктор слишком особенный, чтобы называться методом
- Он ничего не возвращает
- Он изменяет объект до, объект инициализируется
- Он не может назвать себя (представьте, что)
бла-бла-бла
Может существовать разница между языками, но я не думаю, что я дошел до вызова конструктора "специальный метод".
Ответ 6
"Специальный" - это волшебное слово здесь. Нет абсолютно ничего плохого в вызове конструктора специальным методом, но то, что подразумевается в "специальном", зависит от языка.
В большинстве случаев "специальные" означают, что они не могут возвращать значения или быть вызваны как метод без создания нового объекта. Но всегда есть исключения: ярким примером является JavaScript, где конструктор ничем не отличается от нормальной функции, он может возвращать свои собственные значения и может быть вызван либо как конструктор, либо как простая функция.
Ответ 7
@Tom Brito, лично я согласился бы с вами, что конструктор - это особый случай метода.
Также см. ниже:
Конструктор в классе является специальным типом подпрограммы, вызываемой при создании объекта.
... Конструктор напоминает метод экземпляра, но он отличается от метода тем, что он никогда не имеет явного возвращаемого типа...
Источник: Wikipedia
Кроме того, вы можете прочитать мои комментарии к комментариям других (woot4moo, phunehehe).
Ответ 8
По крайней мере, в vb.net конструкторы могут иметь нестандартный поток управления. Если первый оператор конструктора является вызовом New (одного или того же типа или базового типа), последовательность событий будет: (1) выполнить вызов; (2) инициализировать все поля, связанные с типом; (3) завершить обработку остальной части конструктора. Никакой нормальный метод не имеет такого потока управления. Этот поток управления позволяет делать такие вещи, как параметры конструктора паролей, для инициализаторов полей производного типа, если базовый тип записывается таким образом.