ทางเลือกอื่นในการใช้ instanceof ในกรณีนี้?

ดังนั้นในสถานการณ์ที่กำหนดนี้ ฉันไม่แน่ใจว่าจะนำสิ่งนี้ไปใช้ด้วยวิธี OOP มากกว่านี้ได้อย่างไร

ด้วยบริบทดังต่อไปนี้:

  • เกมของฉันมีเอนทิตีระดับซูเปอร์คลาส
  • สิ่งมีชีวิต (เอนทิตีที่เคลื่อนไหว) และเอนทิตีแบบคงที่ (ต้นไม้/หิน/อื่นๆ) ขยายเอนทิตี
  • ฉันมีคลาส EntityManager

ใน EntityManager ของฉัน ฉันจะตรวจสอบว่าเมาส์ของฉันวางอยู่เหนือเอนทิตีหรือไม่ หากเป็นกรณีนี้ ฉันจะเรนเดอร์โอเวอร์เลย์ที่แสดงแผงที่มีชื่อเอนทิตีอยู่

นอกจากชื่อแล้ว ฉันยังต้องการแสดงสถิติพื้นฐานบางอย่าง เช่น 'สุขภาพ' และอาจเป็น 'พลัง/การโจมตีสูงสุด' หรืออะไรสักอย่าง เอนทิตีแบบคงที่ไม่มีคุณลักษณะการต่อสู้ อย่างไรก็ตาม สิ่งมีชีวิตทำเช่นนั้น แต่เนื่องจากฉันส่งคืนเอนทิตี ฉันจะตรวจสอบว่าเอนทิตีนั้นเป็น 'อินสแตนซ์ของ' สิ่งมีชีวิตหรือไม่ และหากเป็นเช่นนั้น ให้วาดสถิติการต่อสู้ มิฉะนั้นเพียงวาดชื่อเอนทิตี

มีวิธี OO ที่ดีกว่าและมากกว่านี้ในการออกแบบโครงสร้างนี้ได้ไหม ฉันได้อ่านแล้วว่าสามารถหลีกเลี่ยงอินสแตนซ์ของการออกแบบ polymorphism/OO ได้

ข้อมูลโค้ดที่เกี่ยวข้อง:

    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 แหล่งที่มา
comment
ยินดีต้อนรับสู่ Stack Overflow! โปรดเข้าร่วม ทัวร์ชม ดูรอบๆ และอ่าน ศูนย์ช่วยเหลือ โดยเฉพาะ ฉันจะถามคำถามที่ดีได้อย่างไร และ ฉันจะถามเกี่ยวกับหัวข้อใดได้บ้าง ไม่มีทางบอกได้ด้วยการเห็นโค้ดของคุณเพียง 3 บรรทัด นี่เป็นคำถามการออกแบบที่ส่งผลต่อชั้นเรียนจำนวนมากของคุณ   -  person Timothy Truckle    schedule 23.11.2017
comment
ควร/อาจมี getDisplayInfo() วิธีการส่งคืนสิ่งที่ควรแสดง จากนั้นคุณสามารถแทนที่ข้อมูลนั้นเพื่อให้ข้อมูลได้มากหรือน้อยตามที่คุณต้องการ คุณกำลังเขียนแบบจำเป็นในตอนนี้ ถ้า x เป็นเอนทิตีให้ทำสิ่งนี้ ถ้า x เป็นสิ่งมีชีวิตให้ทำอย่างนั้น ในขณะที่มันควรจะมากกว่า ให้ x ทำในสิ่งที่จำเป็น   -  person Kayaman    schedule 23.11.2017


คำตอบ (1)


ด้วยระบบคลาสเช่นนี้ EntityManager เรียกเมธอดนามธรรม getInfo() ( นำไปใช้ในคลาสที่เป็นรูปธรรม StaticEntityและ Creature ) สามารถดึงข้อมูลที่จำเป็นได้
บางทีนี่อาจไม่ใช่วิธีแก้ปัญหาที่ดีที่สุด เพราะมันแนะนำฮาร์ดคัปปลิ้งระหว่าง EntityManager และ Entity แต่ไม่จำเป็นต้องใช้ instanceOf

person Jul10    schedule 29.11.2017