Saya tahu bahwa Python tidak mendukung metode overloading, tapi saya mengalami masalah yang sepertinya tidak bisa saya selesaikan dengan cara Pythonic yang bagus.
Saya membuat game di mana karakter perlu menembak berbagai peluru, tetapi bagaimana cara saya menulis fungsi yang berbeda untuk membuat peluru ini? Sebagai contoh misalkan saya memiliki fungsi yang membuat peluru bergerak dari titik A ke B dengan kecepatan yang diberikan. Saya akan menulis fungsi seperti ini:
def add_bullet(sprite, start, headto, speed):
... Code ...
Tapi saya ingin menulis fungsi lain untuk membuat peluru seperti:
def add_bullet(sprite, start, direction, speed):
def add_bullet(sprite, start, headto, spead, acceleration):
def add_bullet(sprite, script): # For bullets that are controlled by a script
def add_bullet(sprite, curve, speed): # for bullets with curved paths
... And so on ...
Demikian seterusnya dengan banyak variasi. Apakah ada cara yang lebih baik untuk melakukannya tanpa menggunakan begitu banyak argumen kata kunci menyebabkan semakin cepat jelek. Mengganti nama masing-masing fungsi sangat buruk juga karena Anda mendapatkan baik add_bullet1
, add_bullet2
atau add_bullet_with_really_long_name
.
Untuk menjawab beberapa jawaban:
Tidak, saya tidak dapat membuat hierarki kelas Bullet karena terlalu lambat. Kode aktual untuk mengelola peluru ada di C dan fungsi saya adalah pembungkus di sekitar C API.
Saya tahu tentang argumen kata kunci tetapi memeriksa segala macam kombinasi parameter semakin mengganggu, tetapi argumen default membantu membagikan seperti
acceleration=0
default value + if + else
untuk melakukan hal yang sama seperti C ++ do. Ini adalah salah satu dari sedikit hal yang dapat dibaca oleh C ++ daripada Python ...
script, curve
itu, apakah mereka memiliki leluhur yang sama, metode apa yang mereka dukung. Dengan bebek-mengetik, terserah Anda untuk desain kelas untuk mencari tahu metode apa yang mereka butuhkan untuk mendukung. Agaknya Script
mendukung semacam callback berbasis timestep (tapi objek apa yang harus dikembalikan? Posisi di timestep itu? Lintasan di timestep itu?). Agaknya start, direction, speed
dan start, headto, spead, acceleration
keduanya menggambarkan jenis lintasan, tetapi sekali lagi terserah Anda untuk merancang kelas penerima untuk mengetahui cara membongkar mereka dan memprosesnya.