"สวัสดี 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) คุณไม่สามารถสร้างวัตถุของคลาสนามธรรม รหัสที่พยายามทำเช่นนั้นจะไม่คอมไพล์

รหัสจาวา คำอธิบาย
ChessItem item = new ChessItem();
item.draw();
รหัสนี้จะไม่รวบรวม
ChessItem item = new Queen();
item.draw();
แต่คุณสามารถทำได้

4)หากคลาสของคุณสืบทอดคลาสนามธรรม คุณต้องแทนที่เมธอดนามธรรมที่สืบทอดมาทั้งหมด นั่นคือคุณต้องนำไปใช้ มิฉะนั้น ชั้นเรียนของคุณจะต้องได้รับการประกาศเป็นนามธรรมด้วย หากคลาสมีเมธอดที่ไม่ได้ใช้งานแม้แต่ตัวเดียวที่ประกาศโดยตรงในคลาสหรือสืบทอดมาจากคลาสพาเรนต์ คลาสนั้นจะถือว่าเป็นนามธรรม

"แต่ทำไมทั้งหมดนี้ถึงจำเป็น? ทำไมเราถึงต้องการคลาสนามธรรม? เป็นไปไม่ได้ที่จะใช้คลาสธรรมดาแทน? และแทนที่จะใช้วิธีนามธรรม เราแค่สร้างการใช้งานเปล่าๆ ซึ่งประกอบด้วยการเปิดและปิดวงเล็บปีกกาไม่ได้หรือ?"

"คุณทำได้ แต่ข้อจำกัดเหล่านี้เหมือนกับprivateตัวปรับแต่ง เราใช้privateตัวปรับแต่งเพื่อปิดกั้นการเข้าถึงข้อมูลโดยตรงอย่างจงใจ เพื่อให้โปรแกรมเมอร์คนอื่นๆ และคลาสของพวกเขาใช้publicวิธีการของเรา"

เช่นเดียวกับคลาสนามธรรม ใครก็ตามที่เขียนคลาสไม่ต้องการให้ใครสร้างอินสแตนซ์ของคลาส ในทางตรงกันข้าม ผู้เขียนคาดหวังว่าวิธีการนามธรรมของคลาสนามธรรมของเขาหรือเธอจะได้รับการสืบทอดและถูกแทนที่

"ฉันยังไม่เข้าใจว่าทำไมเราถึงต้องการให้ชีวิตของเราซับซ้อนด้วยวิธีนี้"

"ข้อดีของคุณสมบัตินี้เห็นได้ชัดในโครงการขนาดใหญ่ ยิ่งคุณมีคลาสมากเท่าไหร่ คุณก็ยิ่งต้องกำหนดบทบาทของพวกเขาให้ชัดเจนมากขึ้นเท่านั้น คุณจะเห็นข้อดีของการทำเช่นนี้ในไม่ช้า ทุกคนต้องผ่านสิ่งนี้"