เป็นเป็ดพิมพ์ส่วนย่อยของความแตกต่าง


17

จากความหลากหลายในวิกิพีเดีย

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

จากการพิมพ์เป็ดบน Wikipedia

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

การตีความของฉันนั้นขึ้นอยู่กับการพิมพ์เป็ดวิธีการ / คุณสมบัติของวัตถุกำหนดความหมายที่ถูกต้อง ความหมายที่วัตถุรูปร่างปัจจุบันกำหนดอินเทอร์เฟซมันรักษา

จากหลากหลายคุณสามารถพูดฟังก์ชั่นเป็น polymorphic ถ้ามันยอมรับหลายชนิดข้อมูลที่แตกต่างกันตราบเท่าที่พวกเขารักษาอินเทอร์เฟซ

ดังนั้นหากฟังก์ชั่นสามารถพิมพ์เป็ดมันสามารถยอมรับหลายชนิดข้อมูลที่แตกต่างกันและดำเนินการกับพวกเขาตราบเท่าที่ชนิดข้อมูลเหล่านั้นมีวิธีการที่ถูกต้อง / คุณสมบัติและทำให้การสนับสนุนอินเตอร์เฟซ

(การใช้อินเทอร์เฟซของคำศัพท์ไม่ได้หมายถึงการสร้างโค้ด แต่เป็นการสร้างเอกสารที่มีความหมายและมีความหมายมากกว่า)

  • ความสัมพันธ์ที่ถูกต้องระหว่าง ducktyping และ polymorphism คืออะไร?
  • หากภาษาหนึ่งสามารถเป็ดชนิดนั่นหมายความว่ามันสามารถทำ polymorphism?

1
ไม่แน่ใจว่าคุณต้องการคำตอบอะไร คุณกำหนดทั้งสองอย่างถูกต้องดังนั้นคุณจึงมีคำตอบที่ชัดเจนที่สุดเท่าที่มีอยู่ การตัดสินใจว่าการพิมพ์เป็ดนับเป็นความหลากหลายนั้นเป็นคำถามเชิงปรัชญามากหรือน้อยหรืออาจเป็นคำศัพท์หากคุณหมายถึงอย่างนั้น ดังนั้นคุณจะมองหาคำตอบในสิ่งที่?
psr

@psr โดยทั่วไปฉันพูดว่า "นี่คือวิธีที่ฉันตีความมันฉันผิดหรือเปล่าฉันถูกต้องหรือไม่มีนักวิชาการที่มีชื่อเสียงที่บอกว่าเป็นทางเดียวหรืออย่างอื่นมีบทความใด ๆ ในหัวข้อหรือไม่" รายละเอียดอื่น ๆ โดยทั่วไปแล้ว "การพิมพ์เป็ดคือการนำไปปฏิบัติ / ส่วนย่อยของ polymorphism" มีอะไรอีกบ้างที่สามารถพูดได้เกี่ยวกับความสัมพันธ์?
Raynos

เท่าที่ฉันเข้าใจว่าhomographyทำให้เป็ดพิมพ์สิ่งอื่นนอกจากชุดอินเตอร์เฟส => ไม่ใช่ polymorphism หรืออย่างน้อยก็ไม่ได้อยู่ในความรู้สึกที่วิกิพีเดียกำหนดไว้ เช่นdoor.close()และtiger.close()
ริ้น

4
พิมพ์เป็ดเป็นกรณีของการเฉพาะกิจ-polymorphism คุณคิดมากเกินไป
yannis

คำตอบ:


16

ฉันพูดว่า polymorphism เป็นลักษณะทั่วไปที่สามารถนำไปใช้ได้หลายวิธี:

  • การสืบทอดตามคลาส
  • วัตถุต้นแบบต้นแบบ (มีหรือไม่มีมรดก)
  • พิมพ์เป็ด
  • ความสอดคล้องของอินเตอร์เฟส (ตามที่ทำโดยส่วนต่อประสานของ Go และโดยนัยในแม่แบบ C ++)

แต่ละคนอนุญาตให้โปรแกรมเมอร์ใช้รหัสเดียวที่มีประเภทต่างกันดังนั้นทุกคนจึงรวบรวมแนวคิดของความหลากหลาย


7

ฉันคิดว่า:

ทั้งการพิมพ์เป็ดและพหุสัณฐานเป็นวิธีการทางอ้อม / นามธรรม ความแตกต่างเป็นแนวคิดที่ก่อตั้งขึ้นในประเภทและการพิมพ์ในขณะที่การพิมพ์เป็ดจะก่อตั้งขึ้นตามสัญญา

ด้วยความแตกต่างมันเป็นสิ่งสำคัญสิ่งที่เป็นและไม่ใช่วิธีการทำงาน (พฤติกรรมมันอาจเป็นผลมาจากสิ่งที่มันเป็น)

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


2
นี่เป็นสิ่งที่ผิด ความแตกต่างเป็นร่มขนาดใหญ่ที่ครอบคลุมสิ่งต่าง ๆ มากมาย โดยเฉพาะมันครอบคลุมการพิมพ์เป็ด ดังนั้นการพิมพ์เป็ดจึงเป็นรูปแบบหนึ่งของความหลากหลาย
Thomas Eding

ฉันไม่เห็นด้วย. การสืบทอดแบบดั้งเดิมที่มีวิธีการพฤติกรรมมีลักษณะเดียวกัน มันเป็นเพียงชนิดปลอดภัยมากขึ้นโดยเป็นที่ชัดเจนเป็นสิ่งที่พฤติกรรมของวัตถุถูกรับประกันการจัดแสดง (ซึ่งไม่รวมพฤติกรรมอื่น ๆ !)
marstato

6

คำตอบคือใช่

Duck Typing เป็นกรณีพิเศษของการพิมพ์แบบไดนามิกและถึงแม้ว่าการพิมพ์แบบไดนามิกต่อ seไม่สามารถพิจารณาได้โดยตรงว่าเป็น polymorphism (เนื่องจากเป็นเพียงคุณสมบัติของภาษาที่จะทำการตรวจสอบชนิดที่รันไทม์แทนที่จะเป็นเวลารวบรวม) เทคนิคที่มักจะ รองรับการพิมพ์แบบไดนามิกเช่นปลายที่มีผลผูกพันและการจัดส่งแบบไดนามิกที่มีลักษณะแตกต่าง


ปัญหาของบทความ Wikipedia และจำนวนผู้ใช้คำศัพท์ในปัจจุบันคือมันไม่ได้กำหนดว่าการพิมพ์เป็ดหมายถึงอะไรเมื่อฉันเห็นครั้งแรก (กล่าวคือรูปแบบของการพิมพ์) แต่แทนที่จะสามารถเรียกใช้วิธีการและโยน ข้อผิดพลาดรันไทม์เมื่อไม่ได้กำหนดไว้ ที่ไม่ได้พิมพ์ แต่ขาดการพิมพ์, เอริค Lippert อธิบาย
reinierpost

1

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

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

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


6
"polymorphism ต้องการ explicitness" มันพูดอย่างนั้นเหรอ? การสืบทอดจากคลาสเป็นเพียงรูปแบบหนึ่งของความหลากหลายไม่ใช่สิ่งเดียว
Javier

และความคิดเห็นของ @ Javier ต่อไปแล้วเรื่องความแตกต่างเฉพาะกิจ ?
yannis

@YannisRizos - ปัญหาในการตอบคำถามใด ๆ เช่นนี้มีหลายภาษาและคำศัพท์มากมายจนใครบางคนอาจเติมเต็มคุณไม่ว่าคุณจะพูดอะไร ฉันเข้าใจว่าทำไม "ad hoc polymorphism" มีคำว่า "polymorphism" ในชื่อ แต่ฉันจะเถียงว่าเป็นอย่างอื่นนอกเหนือจาก OP ที่หมายถึง "polymorphism"
psr

@Javier - วิธีการทั้งหมดที่คุณระบุไว้ต้องมีความชัดเจนยกเว้นการพิมพ์เป็ด
psr

@psr ที่จริงฉันไม่สนใจว่า OP หมายถึงอะไรโดย "polymorphism" ฉันไม่คิดว่าทุกคนควรใส่ใจมันเป็นแนวคิดทางวิทยาศาสตร์ที่มีคำจำกัดความง่าย ๆ ฉันไม่คิดว่าเราควรตอบตามการตีความของเราเองหรือสิ่งที่เราคิดว่าเป็นการตีความ OP โดยเฉพาะอย่างยิ่งการตีความ OPs เนื่องจากเขาถามโดยปริยายว่าเขาไม่แน่ใจเกี่ยวกับการตีความของเขา ฉันไม่เห็นด้วยว่ามันเป็นคำถามเชิงปรัชญาคำถามตามที่ระบุไว้เป็นคำตอบทางวิทยาศาสตร์ที่มีคำตอบง่ายๆ: ใช่ ducktyping เป็นรูปแบบของ ad hoc polymorphism ซึ่งเป็นเซตย่อยหนึ่งของ polymorphism
yannis

1

มันเกือบจะเป็นธรรมชาติที่จะพูดว่า "ใช่ถ้า foo มีการพิมพ์เป็ด foo มี polymorphism" แต่ฉันไม่สามารถพูดได้อย่างแน่นอน 100% ในแง่ที่ว่าอาจเป็นไปได้ที่จะมีตัวอย่างเทียมของระบบดังกล่าวที่มีการพิมพ์เป็ด เป็ด ") ในขณะที่ไม่มี polymorphism (" foo, quack! "ล้มเหลว) แต่พวกเขาจะประดิษฐ์และในโลกแห่งความเป็นจริงฉันจะพูดว่า" ใช่ถ้าการพิมพ์เป็ดนั้นมีอยู่จริง

โดยส่วนตัวฉันเห็นว่าการพิมพ์เป็ดเป็น "ความแตกต่างที่ถูกต้อง" สิ่งที่ฉันหมายถึงคือสิ่งที่มีอยู่ในโลกการพิมพ์เป็ดไม่จำเป็นต้องมีประเภทที่ชัดเจนและพฤติกรรม (polymorphic = "การเข้าถึงเดียวกันผลลัพธ์ที่แตกต่าง") เป็นสิ่งเดียวที่นับ ใน implementations อื่นของ polymorphism มันถูก จำกัด ประเภท / อินเตอร์เฟส / การสืบทอดดังนั้นมันคือ "Implemented และ polymorphism ที่ จำกัด " ไม่ใช่ "polymorphism ต่อ se"


0

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

(B. Pierce และผองเพื่อน)

ดังนั้นอย่างที่คุณสามารถทราบได้ในเรื่องนี้การพิมพ์เป็ดคือการพิมพ์แบบไดนามิก

มีวิธีการในการกำหนดประเภทที่เกี่ยวข้องกับ polymorphing เช่นที่ทำให้รหัสมีความยืดหยุ่นมากขึ้น แต่การพิมพ์เป็ดเป็นปัญหาอื่นโดยรวมในกรณีเหล่านี้

ในรายละเอียดมีแคลคูลัสแลมบ์ดาพิมพ์และแคลคูลัสแลมบ์ดาที่พิมพ์ออกมาที่ช่วยกำหนดคุณสมบัติของการคำนวณและการคำนวณ

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

นั่นคือห้าเซ็นต์ของฉันและฉันเดาว่าจะทำให้หัวข้อการวิจัยที่น่าสนใจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.