..


ลิงก์ผู้สนับสนุน

polymorphism และพิมพ์เป็ดในทับทิม

บทความที่เขียนโดย Alessio Saltarini
หน้า 1 จาก 2

ความแตกต่างที่เป็นเทคนิคการเขียนโปรแกรมที่ช่วยให้การใช้ชิ้นส่วนของรหัสที่มาในขณะที่เหลือไม่มีการเปลี่ยนแปลงเพื่อสร้างพฤติกรรมการใช้เวลา

การสร้างรหัส polymorphic มีความหมายที่เฉพาะเจาะจงในการเขียนโปรแกรมเชิงวัตถุ : มันหมายถึงการสร้างอนุกรมวิธานของการเรียนทั้งหมดที่ใช้อินเตอร์เฟซ

ดังนั้นถ้าตัวอย่างเช่นอิน​​เตอร์เฟซของฉันกำหนดวิธีการ"getArea", ชั้นที่จะใช้อินเตอร์เฟซนี้จะมีวิธีการ"getArea"แต่ละนี้ช่วยให้เราเขียนวิธีการ polymorphic วิธีการที่สามารถเปลี่ยนการดำเนินการขั้นตอนวิธีการของพวกเขา ทั้งนี้ขึ้นอยู่กับชนิดของวัตถุที่ถูกส่งผ่านเป็นอาร์กิวเมนต์

ความแตกต่างในภาษา OOP แบบดั้งเดิม

ใน Java -- แต่เดียวกันเป็นจริงสำหรับ C + + และภาษาอื่น ๆ , Object Oriented (OO) เสร็จแล้วเราก็จะมือกรณีของทับทิม -- ตัวอย่างเช่น :






 IFormaGeometrica อินเตอร์เฟซ







 {



   



 เป็นโมฆะ getArea ();







 }









 สามเหลี่ยม class สาธารณะดำเนินการ IFormaGeometrica







 {



 



 @ Override



 



 public int getArea ()



 



 {



  



 กลับมา (* this.base this.altezza) / 2;



 



 }







 }



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

ในความเป็นจริงถ้าผมเขียนเครื่องคิดเลขชั้นที่ :






 เครื่องคิดเลขระดับสาธารณะขั้นสุดท้าย







 {





 



 ประชาชนเป็นโมฆะคง main (String args [])



 



 {



  



 แบบฟอร์มการเก็บรวบรวม <IFormaGeometrica> =



          



 <IFormaGeometrica> ใหม่ ArrayList ();





  



 forme.add (ใหม่สามเหลี่ยม ());



  



 forme.add (ใหม่สแควร์ ());



  



 forme.add (ใหม่เพนตากอน ());





  



 สำหรับ (IFormaGeometrica กรัม) แบบฟอร์ม



  



 {



   



 System.out.println (g.calcolaArea ());



  



 }



 



 }







 }



นี้สามารถใช้เป็น input คอลเลกชันของรูปทรงเรขาคณิตใด ๆ ให้เห็นว่าวัตถุในการเก็บแต่ละคนจะต้องใช้อินเตอร์เฟซ IFormaGeometrica และที่มีหลักวิธีการ getArea ตัวอย่างเช่นใน Java นี้เป็นวิชาการหมดจด : ในความเป็นจริงอาจจะใน constructor ของแต่ละชั้นเรียนที่เราจะรวมถึงมาตรการที่ใส่ของด้านข้างของรูปทรงเรขาคณิตที่เอียงนั้น, และดังนั้นบน

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

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

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

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

ความแตกต่างในทับทิม

แต่เกิดขึ้นใน Ruby คืออะไร? และ'เป็นไปได้ในทับทิมซึ่งเป็น แต่ไม่ได้รวบรวมการตีความภาษาในการเขียนวิธีการ polymorphic?

ใช่มันเป็นไปได้อย่างแน่นอน แต่มีความแตกต่างที่ลึกซึ้ง"ปรัชญา"กว่าภาษา OO และเรียบเรียงซึ่ง

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

มันจะชอบพูดว่า : เพื่อตรวจสอบว่าเป็นเป็ดที่ด้านหน้าของฉันที่ฉันใช้ DNA และการศึกษาของเขาในห้องปฏิบัติการเพื่อดูว่ามันคือการเป็ด

ใน Ruby ที่คุณกำลังใช้"การทดสอบเป็ด"(การทดสอบเป็ด) ที่คิดค้นโดย James Riley (ดู http://en.wikipedia.org/wiki/Duck_typing ) :

ถ้ามันเดินเหมือนเป็ดและ quacks เช่นเป็ดแล้วมันเป็นเป็ด

(ซึ่งบังเอิญเป็นสิ่งที่ทำให้เราแต่ละคนเมื่อเขาเห็นเป็ด)

นี้หมายความว่าอย่างไร ก็หมายความว่าใน Ruby, และอื่น ๆ โดยทั่วไปในเชิงวัตถุการเขียนสคริปต์ภาษาเช่นเดียวกับงูหลามและ Perl, จำเป็นต้องระบุอินเตอร์เฟซที่ไม่มีความสัมพันธ์ที่ไม่ชัดเจนมรดกระหว่างเรียน

ล่ามเพียง"ไว้วางใจ"ที่โปรแกรมเมอร์, วิธีการทำตามขั้นตอนเมื่อมีวัตถุ polymorphic ว่า"ควรมี"วิธีการบางอย่างเราจริงได้ที่

ในประเภทเดียวกัน ...
E - Learning
Ruby และ Ruby on Rails (หลักสูตร) Ruby และ Ruby on Rails (หลักสูตร)
สร้างโปรแกรมซอฟต์แวร์และเว็บด้วยทับทิมและ ร. จาก 39 €
ลิงก์ผู้สนับสนุน