"สวัสดี Amigo! เรามีหัวข้อใหม่ที่น่าสนใจ"
"วันนี้เป็นเพียงวันของหัวข้อที่น่าสนใจ!"
"ขอบคุณทำไม!"
"ด้วยความยินดี."
"จำตอนที่เราแนะนำคลาสพื้นฐาน ChessItem เพื่อลดความซับซ้อนของคลาสทั้งหมดสำหรับตัวหมากรุกได้ไหม"
"ใช่."
"ลองนึกดูว่าชิ้นส่วนแต่ละชิ้นมีเมธอดที่จัดการการเรนเดอร์ชิ้นส่วนบนหน้าจอ คุณเรียกใช้เมธอดและชิ้นส่วนจะวาดตัวเองที่พิกัดปัจจุบัน การย้ายเมธอดนี้ไปยังคลาสพื้นฐานจะเป็นประโยชน์หรือไม่"
"ใช่." หลังจากที่ฉันได้เรียนรู้เกี่ยวกับความแตกต่างหลากหลายแล้ว ฉันจะสามารถเรียกวิธีการเรนเดอร์สำหรับชิ้นส่วนทั้งหมดได้ โดยไม่คำนึงถึงประเภท อะไรทำนองนี้:"
class ChessBoard
{
public void drawAllChessItems()
{
//draw them regardless of their type.
ArrayList <ChessItem> items = new ArrayList<ChessItem>();
items.add(new King());
items.add(new Queen());
items.add(new Bishop());
//draw them regardless of their type.
for (ChessItem item: items)
{
item.draw();
}
}
}
"ทำได้ดีมาก ถูกต้อง แล้ววิธีการจับฉลากของคลาส ChessItem จะทำอย่างไร"
"ไม่รู้สิ หมากรุกไม่มีชิ้นส่วนแบบนี้ และนั่นหมายความว่ามันไม่มีการแสดงภาพ"
"ถูกต้อง และมันไม่สมเหตุสมผลเลยที่จะสร้างออบเจกต์ ChessItem ไม่มีตัวหมากรุกแบบนี้ มันเป็นเพียงนามธรรม — คลาสที่เราสร้างขึ้นเพื่อความสะดวกนั่นคือวิธีการทำงานของนามธรรมใน OOP: เราย้ายสิ่งสำคัญทั้งหมด (แชร์ โดยทุกชิ้น) ข้อมูลและเมธอดเป็นคลาสฐานแต่เราเก็บความแตกต่างไว้ในคลาสที่สอดคล้องกับตัวหมากรุกเฉพาะ"
Java มีประเภทคลาสพิเศษสำหรับสิ่งนี้: คลาสนามธรรม ต่อไปนี้เป็นสามสิ่งที่ต้องจำเกี่ยวกับคลาสนามธรรม
1) คลาสนามธรรมสามารถประกาศเมธอดโดยไม่ต้องดำเนินการ วิธีดังกล่าวเรียกว่าวิธีการนามธรรม
public abstract class ChessItem
{
public int x, y; //coordinates
private int value; //the piece's "value"
public int getValue() //an ordinary method, returns value
{
return value;
}
public abstract void draw(); //abstract method. There is no implementation.
}
2) วิธีนามธรรมถูกทำเครื่องหมายด้วยคำหลักabstract
หากคลาสมีเมธอดนามธรรมแม้แต่ตัวเดียว คลาสนั้นจะถูกทำเครื่องหมายด้วยabstractด้วย
3) คุณไม่สามารถสร้างวัตถุของคลาสนามธรรม รหัสที่พยายามทำเช่นนั้นจะไม่คอมไพล์
รหัสจาวา | คำอธิบาย |
---|---|
|
รหัสนี้จะไม่รวบรวม |
|
แต่คุณสามารถทำได้ |
4)หากคลาสของคุณสืบทอดคลาสนามธรรม คุณต้องแทนที่เมธอดนามธรรมที่สืบทอดมาทั้งหมด นั่นคือคุณต้องนำไปใช้ มิฉะนั้น ชั้นเรียนของคุณจะต้องได้รับการประกาศเป็นนามธรรมด้วย หากคลาสมีเมธอดที่ไม่ได้ใช้งานแม้แต่ตัวเดียวที่ประกาศโดยตรงในคลาสหรือสืบทอดมาจากคลาสพาเรนต์ คลาสนั้นจะถือว่าเป็นนามธรรม
"แต่ทำไมทั้งหมดนี้ถึงจำเป็น? ทำไมเราถึงต้องการคลาสนามธรรม? เป็นไปไม่ได้ที่จะใช้คลาสธรรมดาแทน? และแทนที่จะใช้วิธีนามธรรม เราแค่สร้างการใช้งานเปล่าๆ ซึ่งประกอบด้วยการเปิดและปิดวงเล็บปีกกาไม่ได้หรือ?"
"คุณทำได้ แต่ข้อจำกัดเหล่านี้เหมือนกับprivate
ตัวปรับแต่ง เราใช้private
ตัวปรับแต่งเพื่อปิดกั้นการเข้าถึงข้อมูลโดยตรงอย่างจงใจ เพื่อให้โปรแกรมเมอร์คนอื่นๆ และคลาสของพวกเขาใช้public
วิธีการของเรา"
เช่นเดียวกับคลาสนามธรรม ใครก็ตามที่เขียนคลาสไม่ต้องการให้ใครสร้างอินสแตนซ์ของคลาส ในทางตรงกันข้าม ผู้เขียนคาดหวังว่าวิธีการนามธรรมของคลาสนามธรรมของเขาหรือเธอจะได้รับการสืบทอดและถูกแทนที่
"ฉันยังไม่เข้าใจว่าทำไมเราถึงต้องการให้ชีวิตของเราซับซ้อนด้วยวิธีนี้"
"ข้อดีของคุณสมบัตินี้เห็นได้ชัดในโครงการขนาดใหญ่ ยิ่งคุณมีคลาสมากเท่าไหร่ คุณก็ยิ่งต้องกำหนดบทบาทของพวกเขาให้ชัดเจนมากขึ้นเท่านั้น คุณจะเห็นข้อดีของการทำเช่นนี้ในไม่ช้า ทุกคนต้องผ่านสิ่งนี้"
GO TO FULL VERSION