За допомогою статичних методів немає об'єкта, який би забезпечив належний контроль над механізмом переосмислення.
Нормальний механізм віртуального методу клас / екземпляр дозволяє тонко налаштовувати контроль над перевірками наступним чином: кожен реальний об'єкт є екземпляром саме одного класу. Цей клас визначає поведінку переопределень; він завжди отримує першу тріщину у віртуальних методах. Потім він може обрати метод виклику батьків у потрібний час для його реалізації. Кожен батьківський метод також отримує свою чергу, щоб викликати свій батьківський метод. Це призводить до гарного каскаду батьківських викликів, який виконує одне з понять повторного використання коду, для якого орієнтація об'єкта відома. (Тут код базових / суперкласів повторно використовується порівняно складним способом; інше ортогональне поняття повторного використання коду в OOP просто має декілька об'єктів одного класу.)
Базові класи можуть бути повторно використані різними підкласами, і кожен може комфортно співіснувати. Кожен клас, який використовується для інстанції об'єктів, що диктують власну поведінку, мирно і одночасно співіснуючи з іншими. Клієнт має контроль над тим, яку поведінку він бажає та коли обирає клас, який використовуватиме для інстанції об'єкта та передає оточуючим за бажанням.
(Це не є досконалим механізмом, оскільки, звичайно, завжди можна визначити можливості, які не підтримуються. Ось чому шаблони, такі як заводський метод та введення залежності, шаруються вгорі.)
Отже, якби ми могли зробити можливість переосмислення статики, не змінюючи нічого іншого, ми мали б труднощі із замовленням переопределень. Важко визначити обмежений контекст для застосуваності переопределення, тому ви отримаєте переоцінку глобально, а не локальніше, як з об'єктами. Немає жодного примірника, який би перемикав поведінку. Отже, якщо хтось посилався на статичний метод, який, начебто, був замінений іншим класом, повинен переосмислити контроль чи ні? Якщо таких варіантів є кілька, хто першим отримує контроль? другий? З заміщенням об'єкта екземпляра всі ці питання мають змістовні та обґрунтовані відповіді, але зі статикою цього немає.
Поміщення статики було б суттєво хаотичним, і подібні речі були зроблені раніше.
Наприклад, Mac OS System 7 та попередньо використовували механізм виправлення пастки для розширення системи, отримуючи контроль над нанесеними додатками системними викликами перед операційною системою. Ви можете подумати про таблицю патчів системних викликів як масив функціональних покажчиків, подібно до vtable для об'єктів, наприклад, за винятком того, що це була одна глобальна таблиця.
Це спричинило нестримне горе програмістів через невпорядкований характер виправлення пасток. Той, хто потрапив в пастку пастки, в основному виграв, навіть якщо цього не хотів. Кожен виправник пастки захоплював би попереднє значення пастки для свого роду батьківського виклику, який був надзвичайно крихким. Видаляючи патч пастки, скажімо, коли вам більше не потрібно було знати про системний виклик, вважали поганою формою, оскільки у вас насправді не було інформації, необхідної для видалення виправлення (якщо ви це зробили, ви також розпакували будь-які інші виправлення, які випливали після цього ти).
Це не означає, що неможливо було б створити механізм переопрацювання статики, але те, що я, мабуть, вважав за краще зробити це - перетворити статичні поля та статичні методи в поля екземплярів та методи екземплярів метакласів, щоб нормальний об'єкт Тоді застосовуватимуться методи орієнтації. Зауважте, що є і такі системи: CSE 341: Класи та метакласи Smalltalk ; Дивіться також: Який еквівалент Smalltalk статики Java?
Я намагаюся сказати, що вам доведеться зробити серйозний дизайн особливостей мови, щоб він працював навіть досить добре. Для одного прикладу було зроблено наївний підхід, він кульгав, але був дуже проблематичним і, мабуть, я б стверджував) архітектурно недоліком, забезпечуючи незавершену і важку у використанні абстракцію.
На той час, коли ви закінчили розробку функції статичних перекриттів, щоб добре працювати, можливо, ви просто винайшли певну форму метакласів, що є природним продовженням OOP на / для методів на основі класу. Отже, немає причини цього не робити - а деякі мови насправді так і роблять. Можливо, це лише трохи більше вимог до того, що деякі мови не хочуть робити.
self
вказівник, який вказує на клас, а не на екземпляр класу.