Трудность довольно проста: если рассматривать объекты в качестве словарей методов или вещей, отвечающих на сообщения, обратите внимание на следующее в общих статически типизированных ОО-языках:
Все словарные ключи / сообщения обычно объявляются заранее с использованием статически объявленных идентификаторов.
Определенные наборы сообщений объявляются заранее, и объекты связываются с этими наборами, чтобы определить, на какие сообщения они отвечают.
Отношения включения одного набора сообщений, являющегося подмножеством другого, объявляются статически и явно; необъявленные, но логические подмножества недействительны.
Проверка типов пытается гарантировать, что все сообщения отправляются только объектам, которые на них отвечают.
Каждый из них в некоторой степени конфликтует с системой на основе прототипов:
Имена сообщений могут быть объявлены заранее, в форме «атомов», интернированных строк или еще чего-нибудь, но не более того; пластичность объектов означает, что присвоение типов методам неудобно.
Возможно, существенной особенностью системы на основе прототипов является то, что наборы сообщений определяются тем, на что реагирует объект, а не наоборот. Было бы разумно назначать псевдонимы определенным комбинациям во время компиляции, но наборы сообщений, определенные во время выполнения, должны быть возможны.
Реальное влияние вышеупомянутых двух результатов отражается в отношениях включения, где явные декларации совершенно неосуществимы. Наследование в статическом, номинальном смысле подтипирования противоположно прототипной системе.
Что подводит нас к последнему пункту, который мы на самом деле не хотим менять. Мы все еще хотим, чтобы сообщения отправлялись только тем объектам, которые на них отвечают. Тем не мение:
- Мы не можем знать статически, какие сообщения могут быть сгруппированы вместе.
- Мы не можем знать, какие группировки являются подмножествами других.
- Мы не можем знать, какие группировки возможны.
- Мы даже не можем указать, какие аргументы отправляются вместе с одним сообщением.
- По сути, мы обнаружили, что вообще ничего не можем указать в общем случае.
Так как это можно обойти? Либо каким-то образом ограничьте полную общность (что неприятно и может быстро убить любые преимущества использования системы на основе прототипа), либо сделайте систему типов намного более гибкой и выражайте ограничения, а не точные типы .
Система типов, основанная на ограничениях, быстро приводит к понятию структурной подтипировки , которое в очень широком смысле можно рассматривать как статический эквивалент «типизации утки». Самым большим препятствием здесь является то, что такие системы намного сложнее для проверки типов и менее известны (что означает небольшую предварительную работу для изучения).
В итоге: это возможно, сделать это сложнее, чем систему номинального статического типа или динамическую систему, основанную на метаданных времени выполнения, и поэтому мало кто об этом беспокоится.