Dengan metode statis, tidak ada objek untuk memberikan kontrol yang tepat terhadap mekanisme override.
Mekanisme metode virtual kelas / instance yang normal memungkinkan untuk mengontrol override yang disetel dengan halus sebagai berikut: setiap objek nyata adalah instance dari satu kelas. Kelas itu menentukan perilaku override; selalu mendapatkan celah pertama pada metode virtual. Kemudian dapat memilih untuk memanggil metode induk pada waktu yang tepat untuk penerapannya. Setiap metode induk kemudian juga mendapat giliran untuk memanggil metode induknya. Ini menghasilkan kaskade bagus dari pemanggilan orang tua, yang memenuhi salah satu konsep penggunaan kembali kode yang dikenal sebagai orientasi objek. (Di sini kode dasar / kelas super digunakan kembali dengan cara yang relatif kompleks; gagasan ortogonal lain tentang penggunaan kembali kode dalam OOP hanya memiliki banyak objek dari kelas yang sama.)
Kelas dasar dapat digunakan kembali oleh berbagai subclass, dan masing-masing dapat hidup berdampingan dengan nyaman. Setiap kelas yang digunakan untuk instantiate objek mendiktekan perilakunya sendiri, secara damai dan bersamaan hidup berdampingan dengan yang lain. Klien memiliki kendali atas perilaku mana yang diinginkan dan kapan dengan memilih kelas mana yang akan digunakan untuk membuat instance objek dan memberikan kepada yang lain sesuai keinginan.
(Ini bukan mekanisme yang sempurna, karena kita selalu dapat mengidentifikasi kemampuan yang tidak didukung, tentu saja, itulah sebabnya pola seperti metode pabrik dan injeksi ketergantungan diletakkan di atas.)
Jadi, jika kita membuat kemampuan menimpa untuk statika tanpa mengubah apa pun, kita akan mengalami kesulitan memesan penggantian. Akan sulit untuk mendefinisikan konteks terbatas untuk penerapan override, sehingga Anda akan mendapatkan override secara global daripada lebih lokal seperti dengan objek. Tidak ada objek instan untuk mengubah perilaku. Jadi, jika seseorang memanggil metode statis yang kebetulan telah ditimpa oleh kelas lain, haruskah override mendapatkan kontrol atau tidak? Jika ada beberapa penggantian semacam itu, siapa yang mendapat kendali lebih dulu? kedua? Dengan mengesampingkan objek instan, semua pertanyaan ini memiliki jawaban yang bermakna dan beralasan, tetapi dengan statika tidak.
Penggantian untuk statika akan sangat kacau, dan, hal-hal seperti ini telah dilakukan sebelumnya.
Misalnya, Mac OS System 7 dan sebelumnya menggunakan mekanisme patch trap untuk memperluas sistem dengan mendapatkan kontrol panggilan sistem buatan aplikasi sebelum sistem operasi. Anda bisa menganggap tabel tambalan panggilan sistem sebagai array penunjuk fungsi, mirip dengan vtable untuk objek contoh, kecuali bahwa itu adalah tabel global tunggal.
Hal ini menyebabkan kesedihan yang tak terhingga bagi para programmer karena sifat patch yang tidak teratur. Siapa pun yang dapat menambal jebakan terakhir pada dasarnya menang, bahkan jika mereka tidak mau. Setiap patcher dari jebakan akan menangkap nilai perangkap sebelumnya untuk semacam kemampuan panggilan induk, yang sangat rapuh. Menghapus tambalan, katakan ketika Anda tidak lagi perlu tahu tentang panggilan sistem dianggap sebagai bentuk yang buruk karena Anda tidak benar-benar memiliki informasi yang diperlukan untuk menghapus tambalan Anda (jika Anda melakukannya, Anda juga akan membuka kancing tambalan lain yang telah mengikuti kamu).
Ini bukan untuk mengatakan bahwa tidak mungkin untuk membuat mekanisme untuk menimpa statika, tetapi apa yang saya lebih suka lakukan adalah mengubah bidang statis dan metode statis menjadi bidang contoh dan metode contoh metaclasses, sehingga objek normal teknik orientasi akan berlaku. Perhatikan bahwa ada sistem yang melakukan ini juga: CSE 341: Kelas Smalltalk dan metaclasses ; Lihat juga: Apa yang dimaksud dengan Smalltalk setara dengan statis Java?
Saya mencoba mengatakan bahwa Anda harus melakukan beberapa desain fitur bahasa yang serius untuk membuatnya bekerja dengan cukup baik. Sebagai contoh, pendekatan naif dilakukan, berjalan pincang, tetapi sangat bermasalah, dan bisa dibilang (yaitu saya berpendapat) secara arsitektur cacat dengan menyediakan abstraksi yang tidak lengkap dan sulit untuk digunakan.
Pada saat Anda selesai merancang fitur penggantian statis agar berfungsi dengan baik, Anda mungkin baru saja menemukan beberapa bentuk metaclasses, yang merupakan perpanjangan alami dari OOP ke / untuk metode berbasis kelas. Jadi, tidak ada alasan untuk tidak melakukan ini - dan beberapa bahasa benar-benar melakukannya. Mungkin sedikit lebih banyak persyaratan tambahan bahwa sejumlah bahasa memilih untuk tidak melakukannya.
self
pointer yang menunjuk ke kelas dan bukan ke instance kelas.