CodeGym /หลักสูตร /จาวาคอร์ /คลาสนามธรรม

คลาสนามธรรม

จาวาคอร์
ระดับ, บทเรียน
มีอยู่

"สวัสดี 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วิธีการของเรา"

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

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

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

3
งาน
จาวาคอร์, ระดับ, บทเรียน
ล็อค
Code entry
Sometimes you don't need to think, you just need to hammer it out! As paradoxical as it may seem, sometimes your fingers will "remember" better than your conscious mind. That's why while training at the secret CodeGym center you will sometimes encounter tasks that require you to enter code. By entering code, you get used to the syntax and assimilate some material. What's more, you combat laziness.
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION