Прототипы и классы

Стив Ягг недавно опубликовал интересный блог-пост о том, что он называет универсальным шаблоном дизайна. Там он детализирует использование прототипов в качестве инструмента моделирования вместо классов. Мне нравится, как это вводит меньшее сцепление по сравнению с наследованием. Но это то, что можно получить и с классами, путем реализации классов в терминах других классов вместо наследования. Кто-нибудь еще имеет успешные истории использования прототипов и может помочь объяснить, где использование прототипов выгодно по сравнению с классами. Я предполагаю, что это сводится к статическому моделированию и динамическому моделированию, но больше примеров было бы очень желанным.

Ответ 1

Один интересный бит заключается в том, что легко сделать языковой акт на основе прототипа OO, но трудно сделать основанный на прототипе язык языка OO.

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

Язык прототипа упрощает сложное наследование. Вы можете реализовать множественное наследование, mixin -подобное поведение, или просто выберите и выберите то, что вы хотите от одного объекта, чтобы добавить к другому.

Статья в Википедии упоминает: "Адвокаты прототипов программирования часто утверждают, что основанные на классе языки поощряют модель развития, которая фокусируется сначала на таксономия и отношения между классами. Напротив, прототипное программирование рассматривается как побуждение программиста сосредоточиться на поведении некоторого набора примеров и только позже беспокоиться о классификации этих объектов в архетипических объектах, которые позже используются в моде, подобном классам."

Чтобы не сказать, что прототипная парадигма - это все плюсы и минусы. Если OO является более ограничительным, это потому, что он хочет быть. Я вижу, где вся эта гибкость может вызвать у вас неприятности, если вы не будете осторожны.

Ответ 2

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

В качестве примера можно проверить любой объектно-ориентированный код на языке прототипа, например, например, JavaScript.

Ответ 3

Для желающих NewtonScript был (есть) двойной язык: у вас были прототипы, и у вас были классы. Вы можете выбрать, следует ли наследовать от класса, от прототипа или от обоих.