Складність досить просто зрозуміти: Вважаючи погляд на об'єкти як словники методів або як речі, які відповідають на повідомлення, дотримуйтесь наступних даних про загальноприйняті статичні типи мов OO:
Усі словникові ключі / повідомлення, як правило, декларуються заздалегідь, використовуючи статично оголошені ідентифікатори.
Певні набори повідомлень декларуються заздалегідь, а об'єкти пов'язані з цими наборами, щоб визначити, на які повідомлення вони відповідають.
Взаємозв'язки включення одного набору повідомлень, що є підмножиною іншого, оголошуються статично і явно; незадекларовані, але логічні підмножини недійсні.
Перевірка типу намагається переконатися, що всі повідомлення надсилаються лише об'єктам, які відповідають на них.
Кожен з них певною мірою конфліктує із системою, заснованою на прототипі:
Імена повідомлень можна оголосити заздалегідь у вигляді "атомів" чи інтернованих рядків чи чогось іншого, але мало іншого; пластичність об'єктів означає, що присвоювати типи методам незручно.
Можливо, суттєвою ознакою системи, заснованої на прототипі, є те, що набори повідомлень визначаються тим, на що відповідає об'єкт, а не навпаки. Було б розумно присвоювати псевдоніми певні комбінації під час компіляції, але набори повідомлень, визначені під час виконання, повинні бути можливими.
Справжній вплив двох вищезгаданих результатів стосується взаємозв'язків з включенням, де явні декларації є абсолютно нездійсненними. Успадкування в статичному, номінальному сенсі підтипу є антитетичним для прототипної системи.
Що призводить нас до кінцевої точки, яку ми насправді не хочемо змінювати. Ми все ще хотіли б гарантувати, що повідомлення надсилаються лише об’єктам, які відповідають на них. Однак:
- Ми не можемо статично знати, які повідомлення можуть бути згруповані разом.
- Ми не можемо знати, які групи є підмножинами інших.
- Ми не можемо знати, які групи можливі.
- Ми навіть не можемо вказати, які саме аргументи надсилаються разом з одним повідомленням.
- В основному ми виявили, що не можемо взагалі багато нічого конкретизувати в цілком загальному випадку.
То як це можна обробити? Або обмежте повну спільність якось (що неприємно, і може швидко знищити будь-які переваги використання системи на основі прототипу в першу чергу), або зробіть тип системи набагато більш текучим і висловлюйте обмеження, а не точні типи .
Система типу на основі обмежень швидко призводить до поняття структурного підтипу , яке в дуже пухкому сенсі можна розглядати як статичний еквівалент "типи качок". Найбільші перешкоди тут полягають у тому, що такі системи набагато складніші для перевірки типу та є менш відомими (що означає, що попередня робота над вивченням).
Підсумовуючи це: Це можливо, це зробити важче, ніж або номінальну систему статичного типу, або динамічну систему, засновану на метаданих часу виконання, і тому мало хто турбується.