CodeGym /หลักสูตร /จาวาคอร์ /มรดก ข้อดีของมรดก

มรดก ข้อดีของมรดก

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

"สวัสดี Amigo! ตอนนี้เป็นหัวข้อที่ฉันคิดว่าคุณต้องใช้มาก ฉันกำลังพูดถึงมรดก "

สำหรับผู้ที่ไม่ได้ฝึกหัด การเขียนโปรแกรมก็เหมือนเวทมนตร์ ผมขอเริ่มด้วยการเปรียบเทียบ...

สมมติว่าคุณเป็นนักมายากลที่ต้องการสร้างม้าบิน คุณสามารถลองเสก Pegasus แต่เนื่องจากม้าบินไม่ได้เกิดขึ้นตามธรรมชาติ คุณจึงมีช่วงเวลาที่ยากลำบากมาก คุณต้องมีงานมากมายที่ต้องทำ มันจะง่ายกว่ามากที่จะเริ่มต้นด้วยม้าและเรียกปีกออกมา

มรดก  ข้อดีของการสืบทอด - 1

ในการเขียนโปรแกรม เราเรียกกระบวนการนี้ว่า «การสืบทอด» . สมมติว่าคุณต้องเขียนคลาสที่ซับซ้อนมาก คุณอาจใช้เวลานานในการเขียนโค้ดตั้งแต่เริ่มต้น จากนั้นจึงทำการทดสอบแบบยาวเพื่อหาจุดบกพร่อง แต่ทำไมมันยากจัง ดีกว่าที่จะมองไปรอบ ๆ และดูว่าชั้นเรียนที่คุณกำลังมองหามีอยู่แล้วหรือไม่?

สมมติว่าคุณพบคลาสที่ใช้ฟังก์ชัน 80% ที่คุณต้องการ คุณเพียงแค่คัดลอกรหัสไปยังชั้นเรียนของคุณ แต่นั่นจะมีข้อเสียหลายประการ:

1) คลาสที่คุณพบอาจถูกคอมไพล์เป็น bytecode แล้ว คุณอาจไม่สามารถเข้าถึงซอร์สโค้ดได้

2) คุณอาจมีซอร์สโค้ดสำหรับชั้นเรียน แต่ยังทำงานในบริษัทที่อาจถูกฟ้องเรียกเงินสองพันล้านถ้าคุณใช้โค้ดของคนอื่นถึง 6 บรรทัด แล้วพวกเขาจะฟ้องคุณ

3) สิ่งนี้นำไปสู่การทำซ้ำรหัสจำนวนมากโดยไม่จำเป็น และหากผู้เขียนของคลาสอื่นพบข้อบกพร่องและแก้ไข คุณก็ยังมีข้อผิดพลาดนั้นอยู่

มีโซลูชันที่สวยงามกว่าที่ไม่ต้องได้รับอนุญาตตามกฎหมายสำหรับรหัสของคลาสดั้งเดิม ใน Java คุณสามารถประกาศคลาสอื่นเป็นพาเรนต์ของคลาสของคุณ ซึ่งเทียบเท่ากับการเพิ่มรหัสของชั้นเรียนนั้นในชั้นเรียนของคุณเอง ข้อมูลและเมธอดทั้งหมดของคลาสพาเรนต์จะปรากฏในคลาสของคุณ ตัวอย่างเช่น คุณสามารถรับมรดกจาก «ม้า» เพิ่ม «ปีก» และรับ «เพกาซัส»

มรดก  ข้อดีของการสืบทอด - 2

"น่าสนใจมาก ไปต่อเถอะ"

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

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

"สมมติว่าเรากำลังเขียนโปรแกรมหมากรุก เราต้องการคลาสสำหรับตัวหมากรุก คุณจะแนะนำคลาสไหน Amigo"

"ราชา, ราชินี, บิชอป, อัศวิน, Rook และ Pawn"

“ดีมาก คุณไม่ได้พลาดอะไรเลย”

"และข้อมูลใดที่คุณจะแนะนำให้จัดเก็บในชั้นเรียนเหล่านี้"

"ตำแหน่งกระดาน (x และ y) และมูลค่าของกระดานแต่ละชิ้น ท้ายที่สุดแล้ว บางชิ้นมีค่ามากกว่าชิ้นอื่น"

"และความแตกต่างระหว่างคลาสเหล่านี้คืออะไร"

"พวกเขาแตกต่างกันในวิธีการเดินหมาก ในพฤติกรรมของพวกเขา"

"ใช่ คุณสามารถกำหนดเป็นคลาสได้ดังนี้:"

class King
{
int x;
int y;
int worth;
void kingMove()
{
//code that defines,
//how the king moves
}
}
class Queen
{
int x;
int y;
int worth;
void queenMove()
{
//code that defines,
//how the queen moves
}
}
class Rook
{
int x;
int y;
int worth;
void rookMove()
{
//code that defines,
//how the rook moves
}
}
class Knight
{
int x;
int y;
int worth;
void knightMove()
{
//code that defines,
//how the knight moves
}
}
class Bishop
{
int x;
int y;
int worth;
void bishopMove()
{
//code that defines,
//how the bishop moves
}
}
class Pawn
{
int x;
int y;
int worth;
void pawnMove()
{
//code that defines,
//how the pawn moves
}
}

“ใช่ ฉันจะเขียนอย่างนั้น”

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

class King extends ChessItem
{
void kingMove()
{
//code that defines,
//how the king moves
}
}
class Queen extends ChessItem
{
void queenMove()
{
//code that defines,
//how the queen moves
}
}
class Rook extends ChessItem
{
void rookMove()
{
//code that defines,
//how the rook moves
}
}
class ChessItem
{
int x;
int y;
int worth;
}
class Knight extends ChessItem
{
void knightMove()
{
//code that defines,
//how the knight moves
}
}
class Bishop extends ChessItem
{
void bishopMove()
{
//code that defines,
//how the bishop moves
}
}
class Pawn extends ChessItem
{
void pawnMove()
{
//code that defines,
//how the pawn moves
}
}

"น่าสนใจจัง!"

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

“แล้วต้องทำยังไงถึงจะสืบทอดคลาสได้”

"หลังจากประกาศคลาสแล้ว เราใช้คีย์เวิร์ด ' extends ' ตามด้วยชื่อคลาสพาเรนต์คุณสามารถสืบทอดจากคลาสเดียวเท่านั้น "

มรดก  ข้อดีของการสืบทอด - 3

รูปภาพแสดง "วัว" ที่สืบทอดมาจาก «หมู» «หมู» สืบทอดมาจาก «ไก่» และ «ไก่» สืบทอดมาจาก «ไข่» แต่ละชั้นเรียนมีผู้ปกครองเพียงคนเดียว! มรดกดังกล่าวไม่สมเหตุสมผลเสมอไป หากคุณมีแค่หมู แต่คุณต้องการวัวจริงๆ โปรแกรมเมอร์มักจะไม่สามารถต้านทานความปรารถนาที่จะสร้าง «วัว» จาก «หมู» ได้

"แต่ถ้าฉันต้องการสืบทอดจากสองคลาสล่ะ? มีอะไรที่ฉันสามารถทำได้ไหม?!"

"ไม่จริง คลาส Java ไม่รองรับการสืบทอดการใช้งานหลายรายการ: คลาสสามารถมีคลาสพาเรนต์ได้เพียงคลาสเดียวเท่านั้น แต่มีการสืบทอดหลายประเภท ซึ่งหมายความว่าคลาสหนึ่งสามารถใช้อินเทอร์เฟซมากกว่าหนึ่งอินเทอร์เฟซ ซึ่งช่วยลดปัญหาได้เล็กน้อย "

"ฉันเข้าใจ แล้วอินเทอร์เฟซคืออะไร"

"ฉันจะบอกคุณเกี่ยวกับอินเทอร์เฟซในวันพรุ่งนี้ สำหรับตอนนี้ เรามาเจาะลึกเรื่องการสืบทอดกันต่อ"

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.
3
งาน
จาวาคอร์, ระดับ, บทเรียน
ล็อค
Code typing
Your attention, please! Now recruiting code entry personnel for CodeGym. Turn up your focus, let your fingers relax, read the code, and then... type it into the appropriate box. Code entry is far from a useless exercise, though it might seem so at first glance: it allows a beginner to get used to and remember syntax (modern IDEs seldom make this possible).
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION