ผลต่างระหว่างรุ่นของ "Oop lab/gdx/pacman rev"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
แถว 1: แถว 1:
 
: ''หน้านี้เป็นส่วนหนึ่งของ [[oop lab]]''
 
: ''หน้านี้เป็นส่วนหนึ่งของ [[oop lab]]''
 +
 +
เราจะแสดงตัวอย่างรูปแบบหนึ่งของการสร้าง subclass  เราจะสร้าง subclass ของ Pacman ชื่อคลาส ReversePacman ที่เป็น Pacman ตระกูลหนึ่ง ซึ่งเวลาเดินจะเดินกลับทิศกับ Pacman อื่น ๆ
 +
 +
'''คำศัพท์ที่เกี่ยวข้อง'''
 +
 +
* subclass / superclass
 +
* inheritance
  
 
== สร้างคลาสใหม่ ==
 
== สร้างคลาสใหม่ ==
 +
เราสามารถสร้างคลาสใหม่โดยกด New จากนั้นค่อยมาป้อนว่าคลาส inherit จากคลาสใด ด้วยคีย์เวิร็ด extends ก็ได้ หรือจะเลือกจากเมนูเลยก็ได้ (ดูรูปด้านล่าง)
 +
 +
[[Image:Ooplab-inheritance-create-class.png]]
 +
 +
เราจะเลือกคลาสที่จะ inherit มาโดยกำหนดที่ superclass เราสามารถพิมพ์บางส่วนของชื่อ เช่น Pacman แล้วกด Browse ได้
 +
 +
เมื่อสร้างเสร็จจะได้คลาสเปล่า ๆ มา
 +
 +
อย่างไรก็ตาม คลาสนั้นยังใช้งานไม่ได้เพราะว่ายังไม่ได้เขียน Constructor (ถ้าคลาสแม่มี constructor ที่ไม่รับพารามิเตอร์ Java จะอนุโลมให้ไปใช้ constructor นั้นได้ แต่กรณีของ Pacman นั้นไม่มี เราจึงต้องเขียนเอง)  อย่างไรก็ตาม Eclipse สามารถสร้างโค้ด constructor ที่ไปเรียก constructor ของคลาสแม่ให้ได้ด้วย  จะได้โค้ดดังด้านล่าง
 +
 
<syntaxhighlight lang="java">
 
<syntaxhighlight lang="java">
 
public class ReversePacman extends Pacman {
 
public class ReversePacman extends Pacman {
แถว 11: แถว 28:
  
 
== Override method ==
 
== Override method ==
 +
เราจะปรับ ReversePacman ให้รับ nextDirection กลับทิศกลับทางแทน  โดยเราจะไปแก้เมท็อด setNextDirection  เราเขียนเมท็อดใหม่โดยใส่ annotation @Override ไว้ด้วย (ใส่ทำไม? [http://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-why อ่านสาเหตุที่นี่])
 +
 
<syntaxhighlight lang="java">
 
<syntaxhighlight lang="java">
 
     @Override
 
     @Override
แถว 16: แถว 35:
 
     }
 
     }
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
จากนั้นแก้ให้กำหนดค่าเป็นทิศสลับกัน  ในการคำนวณทิศที่สลับด้านดังกล่าว เราจะสร้างตัวแปร reverseDirMap เพื่อเก็บค่าเอาไว้ก่อน
  
 
<syntaxhighlight lang="java">
 
<syntaxhighlight lang="java">

รุ่นแก้ไขปัจจุบันเมื่อ 22:43, 17 พฤศจิกายน 2559

หน้านี้เป็นส่วนหนึ่งของ oop lab

เราจะแสดงตัวอย่างรูปแบบหนึ่งของการสร้าง subclass เราจะสร้าง subclass ของ Pacman ชื่อคลาส ReversePacman ที่เป็น Pacman ตระกูลหนึ่ง ซึ่งเวลาเดินจะเดินกลับทิศกับ Pacman อื่น ๆ

คำศัพท์ที่เกี่ยวข้อง

  • subclass / superclass
  • inheritance

สร้างคลาสใหม่

เราสามารถสร้างคลาสใหม่โดยกด New จากนั้นค่อยมาป้อนว่าคลาส inherit จากคลาสใด ด้วยคีย์เวิร็ด extends ก็ได้ หรือจะเลือกจากเมนูเลยก็ได้ (ดูรูปด้านล่าง)

Ooplab-inheritance-create-class.png

เราจะเลือกคลาสที่จะ inherit มาโดยกำหนดที่ superclass เราสามารถพิมพ์บางส่วนของชื่อ เช่น Pacman แล้วกด Browse ได้

เมื่อสร้างเสร็จจะได้คลาสเปล่า ๆ มา

อย่างไรก็ตาม คลาสนั้นยังใช้งานไม่ได้เพราะว่ายังไม่ได้เขียน Constructor (ถ้าคลาสแม่มี constructor ที่ไม่รับพารามิเตอร์ Java จะอนุโลมให้ไปใช้ constructor นั้นได้ แต่กรณีของ Pacman นั้นไม่มี เราจึงต้องเขียนเอง) อย่างไรก็ตาม Eclipse สามารถสร้างโค้ด constructor ที่ไปเรียก constructor ของคลาสแม่ให้ได้ด้วย จะได้โค้ดดังด้านล่าง

public class ReversePacman extends Pacman {
    public ReversePacman(int x, int y, World world) {
        super(x, y, world);
    }
}

Override method

เราจะปรับ ReversePacman ให้รับ nextDirection กลับทิศกลับทางแทน โดยเราจะไปแก้เมท็อด setNextDirection เราเขียนเมท็อดใหม่โดยใส่ annotation @Override ไว้ด้วย (ใส่ทำไม? อ่านสาเหตุที่นี่)

    @Override
    public void setNextDirection(int dir) {
    }

จากนั้นแก้ให้กำหนดค่าเป็นทิศสลับกัน ในการคำนวณทิศที่สลับด้านดังกล่าว เราจะสร้างตัวแปร reverseDirMap เพื่อเก็บค่าเอาไว้ก่อน

public class ReversePacman extends Pacman {
    private int [] reverseDirMap;
    
    public ReversePacman(int x, int y, World world) {
        super(x, y, world);
        
        reverseDirMap = new int[5];
        reverseDirMap[Pacman.DIRECTION_STILL] = Pacman.DIRECTION_STILL;
        reverseDirMap[Pacman.DIRECTION_LEFT] = Pacman.DIRECTION_RIGHT;
        reverseDirMap[Pacman.DIRECTION_RIGHT] = Pacman.DIRECTION_LEFT;
        reverseDirMap[Pacman.DIRECTION_UP] = Pacman.DIRECTION_DOWN;
        reverseDirMap[Pacman.DIRECTION_DOWN] = Pacman.DIRECTION_UP;
    }

    @Override
    public void setNextDirection(int dir) {
        int revDir = reverseDirMap[dir]; 
        super.setNextDirection(revDir);
    }
}

สร้างใน World

public class World {
    // ...    
    World(PacmanGame pacmanGame) {
        // ...

        //pacman = new Pacman(60,60,this);
        pacman = new ReversePacman(60,60,this);

        // ...
    }
}