เสมือนจริงหรือนามธรรมสิ่งที่อยู่ในชื่อ?


15

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

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

เพื่ออ้างอิงคำตอบของ Jon Skeet กับคำตอบของฉันว่าบริสุทธิ์และไม่บริสุทธิ์เป็นคำทั่วไปที่ใช้:

@ สตีเว่น: อืม ... เป็นไปได้ แต่ข้าเคยเห็นมันในบริบทของซีพลัสพลัสมาก่อน ฉันสงสัยว่าทุกคนที่พูดถึงพวกเขาน่าจะมีพื้นหลังเป็น C ++ :)

คำนี้มาจากภาษา C ++ หรือเป็นคำนิยามหรือนำไปใช้เป็นภาษาแรกและเป็นศัพท์ทางวิทยาศาสตร์ที่ 'เป็นทางการ' หรือไม่

UPDATE:

Frank Shearar ให้ลิงก์ไปยังคำอธิบายของSIMULA 67 Common Base Language (1970) อย่างเป็นประโยชน์ ภาษานี้ดูเหมือนว่าจะเป็นภาษาแรกที่จะแนะนำคำหลัก OO เป็นระดับ , วัตถุและยังเสมือนเป็นแนวคิดที่เป็นทางการ มันไม่ได้กำหนดบริสุทธิ์ / ไม่ใช่บริสุทธิ์หรือนามธรรมแต่มันไม่สนับสนุนแนวคิด

ใครเป็นคนกำหนด


1
อาจพบว่าน่าสนใจ ... objectmentor.com/resources/articles/abcpvf.pdf
Aaron McIver

2
ฟังก์ชั่นเสมือน, การสืบทอดเสมือน, ตารางเสมือน - ไม่มีคำอธิบายที่แท้จริงของสิ่งที่ทำให้พวกเขา "เสมือน" ฉันรู้กฎ แต่ทำไมคำนั้น ท้ายที่สุดแล้วฟังก์ชั่น "เวอร์ชวล" นั้นมีความเป็นจริงเหมือนกับฟังก์ชั่นอื่น ๆ - เพียงแค่ต้องการการค้นหาที่ล่าช้า บางที Stroustrup อาจชอบคำนี้มาก ฉันคิดว่าชั้นเรียนเป็นนามธรรม (ไม่บริสุทธิ์) ในขณะที่วิธีการอาจจะบริสุทธิ์ (แต่ไม่เป็นนามธรรม) เป็นไปได้ที่ฉันจะทำมันขึ้นมา
Steve314

3
@ Steve314 มันก็ไม่ Stroustrup - เห็นได้ชัดว่าพวกเขาถูกเรียกเช่นนี้แล้วในSimula
PéterTörök

คำตอบ:


9

Nygaard และดาห์ลใช้ในระยะแรกในSimula 67 สามัญฐานภาษา ดูในหัวข้อ 2.1 ตัวอย่างเช่นและส่วน 2.2.3 (เท่าที่ฉันสามารถบอกได้อย่างน้อยที่สุด แต่เดี๋ยวก่อนเท่าที่ OOP กังวลก็อาจเป็นการใช้คำศัพท์ครั้งแรก)


3
Simula เป็นภาษา OO แรก AFAIK ดังนั้นจึงมีการใช้คำศัพท์จำนวนมากเป็นครั้งแรกในบริบท OOP มันมีอิทธิพลอย่างมากต่อ Stroustrup ซึ่งในตอนแรกต้องการแค่ภาษาที่มี C ประสิทธิภาพและคลาส Simula
David Thornley

ฉันอ่านบทความนี้และดูเหมือนว่าจะเป็นครั้งแรกเนื่องจากพวกเขาแนะนำ 'คลาส' และ 'วัตถุ'
Steven Jeuris

2
ดังนั้นหลังจากเวลาผ่านไประยะหนึ่งก็สูญเสียการอ่านคำจำกัดความ SIMULA 67 Simula 67 ประกาศเกียรติคุณ 'เสมือน' พร้อมกับ 'คลาส', 'วัตถุ', 'ซ่อน', 'การเรียกตามค่า', 'การโทรโดยการอ้างอิง' ในปี 1970 ไม่มีสัญลักษณ์ของ 'บริสุทธิ์', 'ไม่บริสุทธิ์' หรือ 'นามธรรม'
Steven Jeuris

5
"สิ้นเปลือง" ดูเหมือนคำแปลก ๆ ที่ใช้อธิบายการอ่านเอกสารน้ำเชื้อของฟิลด์
Frank Shearar

7

ดังนั้น ... ฉันทำวิจัยเล็กน้อย บทเรียนต่อไปนี้เป็นบทเรียนประวัติศาสตร์เล็กน้อยสำหรับผู้ที่สนใจ :) ข้ามไปยังข้อสรุปที่ด้านล่างหากคุณสนใจคำตอบเท่านั้น

พ.ศ. 2510 :

Simula 67 , เชิงวัตถุภาษาการเขียนโปรแกรมครั้งแรกกำหนดเป็นคำหลักชั้น , วัตถุ , โทรโดยการอ้างอิง , โทรโดยค่าและเสมือน

ระบบการสืบทอดของ SIMULA นั้นเป็นที่รู้จักกันในชื่อเดิมคือconcatenation (และต่อมารู้จักกันในชื่อprefixing ) ซึ่งอ้างถึงความจริงที่ว่ารหัสของ supertypes ถูกคัดลอกและ 'concatenated' พร้อมรหัสย่อย ต่อมาอีกรูปแบบหนึ่งของระบบการสืบทอดเกิดขึ้นการมอบหมายที่การโทรได้รับการมอบหมายโดยการอ้างอิงถึงประเภทที่ถูกต้อง

เสมือนมีแนวโน้มมากที่สุดหมายถึงกระบวนการที่จะต้องดำเนินการเพื่อส่งการเรียกร้องให้การดำเนินงานที่ถูกต้องโดยใช้ตารางวิธีเสมือน มันเสมือนจริงเมื่อเทียบกับการใช้งานแบบถาวร / เป็นรูปธรรม

พ.ศ. 2514 :

Niklaus Wirth เขียนเกี่ยวกับแนวคิดที่กำหนดเป็นการปรับแต่งแบบขั้นตอนแบบขั้นตอนการปรับแต่งโดยทั่วไปจะอธิบายวิธีแบ่งโปรแกรมในโซลูชันบางส่วนซึ่งสามารถขยายได้

1974 :

นี่คือกระดาษแรกสุดที่ฉันค้นพบซึ่งเหรียญประเภทข้อมูลนามธรรมโดยบาร์บาร่าลิสคอฟลิสคอฟ

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

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

คำศัพท์ทางวิทยาศาสตร์ที่น่าสนใจ (บทความจากปี 1996):

มรดก : กลไกระดับต่ำที่วัตถุหรือคลาสสามารถแชร์ลักษณะการทำงานหรือข้อมูลได้

ชนิดย่อย : แสดงความเชี่ยวชาญเฉพาะทาง รูปแบบเฉพาะของการสืบทอดที่เรียกว่าอินเตอร์เฟซการรับมรดก

หลักการที่เป็นนามธรรม : กระบวนการในการจัดระเบียบความรู้ของเราเกี่ยวกับโดเมนแอพพลิเคชั่นไปสู่การจัดอันดับลำดับขั้นของการเรียงลำดับของ abstractions เพื่อให้ได้ความเข้าใจที่ดีขึ้นของปรากฏการณ์ที่เกี่ยวข้อง

abstractions นำมาใช้บางส่วน : abstractions ซึ่งมีคำจำกัดความที่ถูกทิ้งไว้โดยไม่ตั้งใจ

คลาสนามธรรม : คำศัพท์เฉพาะสำหรับการนำไปใช้บางส่วนคลาสที่ในระบบเชิงวัตถุ

การสืบทอดแบบไม่ จำกัด : อนุญาตให้การดำเนินการถูกกำหนดใหม่ (หรือลบออก) ในคลาสย่อย

มรดกที่เข้มงวด : การสืบทอดที่เข้ากันได้กับพฤติกรรม

ข้อสรุป :

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

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

ใครสนใจปรับรายการวิกิพีเดีย ? :)


ก่อน Barbara Liskov, Dijkstra ก็มีบางอย่างที่จะพูดเกี่ยวกับ"องค์ประกอบขั้นตอนที่ชาญฉลาดโปรแกรม"ซึ่งอาจเป็นทรัพยากรที่เกี่ยวข้อง
Steven Jeuris

4

ใน C ++ ฟังก์ชันสมาชิกที่ถูกผูกไว้แบบไดนามิกและสามารถถูกแทนที่โดยคลาสย่อยเรียกว่า "virtual" ฟังก์ชั่นเสมือนจริงที่ต้องถูกแทนที่อย่างแน่นอนเรียกว่า "pure virtual" โปรดทราบว่าฟังก์ชั่นเสมือนบริสุทธิ์อาจมีร่างกายแม้ว่าบ่อยครั้งที่มันไม่ได้ คลาสที่มีฟังก์ชันเสมือนบริสุทธิ์อย่างน้อยหนึ่งฟังก์ชันเรียกว่า "นามธรรม" และไม่สามารถสร้างอินสแตนซ์ได้ซึ่งมาจากเท่านั้น

ฉันเดาว่าทำไมฟังก์ชั่นเสมือนถูกเรียกว่าเวอร์ชวลคือความจริงที่ว่ามันไม่เป็นที่รู้จักซึ่งจะเรียกฟังก์ชั่นที่เกิดขึ้นจริงในเวลารวบรวม เรียกว่าฟังก์ชั่นเสมือน "ไม่มี" ในเวลารวบรวม

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

แก้ไข:ภาษาอื่น ๆ

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

ใน C ++ ความแตกต่างระหว่าง virtual และ non-virtual เป็นสิ่งที่จำเป็นเพราะมันขึ้นอยู่กับโปรแกรมเมอร์ที่จะตัดสินใจว่าควรใช้การผูกแบบไดนามิกเพื่อบันทึกบนโอเวอร์เฮดเมื่อไม่จำเป็น


1
+1: "นามธรรม" ยังใช้กับหลายภาษา "เสมือน" ไม่
S.Lott

@ S.Lott: คำถามทั้งหมดไม่ว่าจะเป็นเสมือนคำทั่วไปหรือไม่ เท่าที่ฉันสามารถบอกได้ในขณะนี้เสมือนใช้กับหลายภาษาและได้รับการประกาศเกียรติคุณเป็นครั้งแรกโดย Simula คำถามยังคงเกี่ยวกับบริสุทธิ์ / ไม่บริสุทธิ์และนามธรรม
Steven Jeuris

@Steven Jeuris: "virtual ใช้กับหลายภาษา" หรือไม่ จริงๆ. จนถึงตอนนี้ดูเหมือนว่าจะเป็น C, C ++ และ Simula แน่นอนมันใช้ไม่ได้กับ Python แม้แต่นิดเดียว ดูเหมือนจะไม่ใช้กับ Java
S.Lott

ใช้กับ Object Pascal / Delphi Delphi มีแนวคิดเพิ่มเติมdynamic- ซึ่งเป็นวิธีเสมือนจริงที่ซื้อขายพื้นที่ในเวลา: พวกเขาใช้พื้นที่น้อยกว่าและช้ากว่าที่จะดำเนินการกว่าvirtualวิธี
Frank Shearar

2
@Steven Jeuris: "virtual by default" ไม่เหมือนกับการใช้ "virtual" เพื่ออธิบายฟังก์ชั่นนามธรรม ฉันคิดว่าคนที่พูดว่า "ฟังก์ชั่นทั้งหมดเป็นเสมือนจริง" กำลังใช้แนวคิด C ++ กับภาษาอื่น และฉันคิดว่าพวกเขาทำมันไม่ถูกต้อง เนื่องจากฟังก์ชั่นเมธอดทั้งหมดเป็นเสมือนจริงใน Python ดังนั้นจึงไม่มีการพูดถึงหัวข้อโดยใช้ "virtual" ยกเว้นในสถานที่เช่น Stack Overflow เพื่อใช้แนวคิด C ++ กับ Python ฉันคิดว่าระบบเสมือนถูกใช้อย่างไม่ถูกต้องในกรณีเหล่านี้เนื่องจากเอกสารภาษา Python ไม่ได้ใช้คำ
S.Lott
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.