Alternatif untuk menggunakan instanceof dalam kasus ini?

jadi dalam skenario yang diberikan, saya tidak sepenuhnya yakin bagaimana saya akan mengimplementasikan ini dengan cara yang lebih OOP.

Mengingat konteks berikut:

  • Game saya memiliki Entitas superkelas
  • Makhluk (entitas bergerak) dan StaticEntities (pohon/batu/dll) memperluas Entitas
  • Saya memiliki kelas EntityManager.

Di EntityManager saya, saya memeriksa apakah mouse saya melayang di atas suatu Entitas. Jika hal ini terjadi, saya membuat overlay yang menunjukkan panel dengan nama Entitas di atasnya.

Selain namanya, saya juga ingin menampilkan sesuatu seperti beberapa statistik dasar, seperti 'kesehatan' dan mungkin 'kekuatan/pukulan maksimal' atau semacamnya. Entitas Statis tidak memiliki atribut tempur. Namun makhluk melakukannya, tetapi karena saya mengembalikan Entitas, saya memeriksa apakah Entitas tersebut adalah Makhluk 'instanceof' dan jika demikian: Gambarkan statistik pertempuran. Jika tidak, cukup gambarkan nama Entitasnya.

Mungkinkah ada cara yang lebih baik dan lebih OO dalam merancang konstruksi ini? Saya telah membaca bahwa instanceof dapat dihindari dengan desain polimorfisme/OO.

Cuplikan kode terkait:

    if(hoveringEntity instanceof Creature) {
        hoveringEntity = (Creature) hoveringEntity;

        // Custom Util class to draw a String
        Text.drawString(g, "Max hit: " + getDamage(hoveringEntity), x, y, true, Color.YELLOW, Assets.font14);
    }

person iPsych0    schedule 23.11.2017    source sumber
comment
Selamat datang di Stack Overflow! Silakan ikuti tur, lihat-lihat, dan baca pusat bantuan, khususnya Bagaimana cara mengajukan pertanyaan yang baik? dan Topik apa yang dapat saya tanyakan di sini?. Tidak ada cara untuk mengetahuinya dengan hanya melihat 3 baris kode Anda. Ini adalah pertanyaan desain yang mempengaruhi banyak kelas Anda.   -  person Timothy Truckle    schedule 23.11.2017
comment
Harus/mungkin ada metode getDisplayInfo() yang mengembalikan apa yang harus ditampilkan. Kemudian Anda dapat menggantinya untuk memberikan informasi sebanyak atau sesedikit yang Anda inginkan. Anda sedang menulis dengan cara yang sangat penting saat ini, jika x adalah entitas, lakukan ini, jika x adalah makhluk, lakukan itu padahal seharusnya lebih dari membiarkan x melakukan apa yang perlu dilakukan.   -  person Kayaman    schedule 23.11.2017


Jawaban (1)


Dengan sistem kelas seperti ini, EntityManager, memanggil metode abstrak getInfo() (diimplementasikan di kelas konkrit StaticEntitydan Creature ), dapat mengambil info yang diperlukan.
Mungkin ini bukan solusi terbaik, karena ini memperkenalkan hubungan yang sulit antara EntityManager dan Entity, tetapi tidak perlu menggunakan instanceOf.

person Jul10    schedule 29.11.2017