..
ความแตกต่างที่เป็นเทคนิคการเขียนโปรแกรมที่ช่วยให้การใช้ชิ้นส่วนของรหัสที่มาในขณะที่เหลือไม่มีการเปลี่ยนแปลงเพื่อสร้างพฤติกรรมการใช้เวลา
การสร้างรหัส 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 ว่า"ควรมี"วิธีการบางอย่างเราจริงได้ที่
| |
Ruby และ Ruby on Rails (หลักสูตร)
สร้างโปรแกรมซอฟต์แวร์และเว็บด้วยทับทิมและ ร. จาก 39 € |