tl; dr: คุณสามารถมีการสืบทอดโดยไม่มี OO คุณสามารถมี encapsulation โดยไม่มี OO คุณสามารถมี polymorphism ที่ไม่มี OO คุณสามารถมีทั้งสามอย่างในเวลาเดียวกันโดยไม่มี OO บน flipside คุณสามารถมี OO ได้โดยไม่มีการสืบทอด นอกจากนี้ยังมีการห่อหุ้มหลายประเภท (ADT-oriented และ OO) IOW encapsulation ทั้งหมดไม่ใช่ OO
รุ่นยาว:
คำว่า "การเขียนโปรแกรมเชิงวัตถุ" ถูกคิดค้นโดย Alan Kay ดังนั้นเขาจึงตัดสินใจได้ว่ามันหมายถึงอะไร และเขากำหนดวิธีนี้ :
OOP สำหรับฉันหมายถึงเพียงการส่งข้อความการเก็บรักษาในท้องถิ่นและการป้องกันและการซ่อนกระบวนการของรัฐและการผูกมัดปลายสุดของทุกสิ่ง
การนำไปใช้งานอย่างชาญฉลาดการรับส่งข้อความเป็นการเรียกโพรซีเดอร์ล่าช้าและหากการเรียกโพรซีเดอร์ล่าช้าคุณไม่สามารถรู้ได้ในขณะออกแบบสิ่งที่คุณกำลังจะเรียกดังนั้นคุณจึงไม่สามารถทำการตั้งสมมติฐานใด ๆ ดังนั้นจริงๆแล้วมันเกี่ยวกับการรับส่งข้อความการผูกมัดปลายคือการใช้การส่งข้อความและการห่อหุ้มเป็นผลมาจากมัน
ในภายหลังเขาชี้แจงว่า " ความคิดใหญ่คือ 'การส่งข้อความ' " และรู้สึกเสียใจที่เรียกมันว่า "เชิงวัตถุ" แทนที่จะเป็น "ข้อความเชิง" เพราะคำว่า "เชิงวัตถุ" ทำให้ความสำคัญกับสิ่งที่ไม่สำคัญ (วัตถุ ) และเบี่ยงเบนความสนใจจากสิ่งที่สำคัญจริงๆ (การส่งข้อความ):
เพียงเตือนความทรงจำเบา ๆ ว่าฉันเอาความเจ็บปวดที่ OOPSLA สุดท้ายเพื่อพยายามเตือนทุกคนว่า Smalltalk ไม่เพียง แต่ไม่ได้เป็นไวยากรณ์หรือไลบรารีของชั้นเรียนเท่านั้น ฉันขอโทษที่ฉันนานมาแล้วประกาศเกียรติคุณคำว่า "วัตถุ" สำหรับหัวข้อนี้เพราะมันทำให้คนจำนวนมากมุ่งเน้นไปที่ความคิดที่น้อยกว่า
แนวคิดหลักคือ "การส่งข้อความ" - นั่นคือสิ่งที่ kernal ของ Smalltalk / Squeak เป็นเรื่องเกี่ยวกับ (และเป็นสิ่งที่ไม่เคยเสร็จสมบูรณ์ในช่วง Xerox PARC ของเรา) ภาษาญี่ปุ่นมีคำขนาดเล็ก - มา - สำหรับ "สิ่งที่อยู่ระหว่าง" - อาจเทียบเท่าภาษาอังกฤษที่ใกล้ที่สุดคือ "คั่นระหว่างหน้า" กุญแจสำคัญในการทำให้ระบบที่ยอดเยี่ยมและเติบโตได้นั้นมีมากขึ้นในการออกแบบว่าโมดูลสื่อสารได้อย่างไรมากกว่าคุณสมบัติและพฤติกรรมภายในของมัน คิดถึงอินเทอร์เน็ต - เพื่อการมีชีวิตอยู่ (ก) ต้องอนุญาตความคิดและการรับรู้ที่แตกต่างหลากหลายซึ่งอยู่นอกเหนือมาตรฐานเดียวและ (b) เพื่อให้การทำงานร่วมกันอย่างปลอดภัยระหว่างความคิดเหล่านี้มีระดับแตกต่างกัน
(แน่นอนวันนี้ผู้คนส่วนใหญ่ไม่ได้สนใจวัตถุ แต่เรียนซึ่งผิดยิ่งกว่า)
การส่งข้อความเป็นพื้นฐานของ OO ทั้งในฐานะคำอุปมาและเป็นกลไก
หากคุณส่งข้อความถึงใครบางคนคุณไม่รู้ว่าพวกเขาทำอะไรกับมัน เพียงสิ่งที่คุณสามารถสังเกตคือการตอบสนองของพวกเขา คุณไม่ทราบว่าพวกเขาประมวลผลข้อความด้วยตนเอง (เช่นถ้าวัตถุมีวิธีการ) ถ้าพวกเขาส่งต่อข้อความไปยังคนอื่น (มอบหมาย / ผู้รับมอบฉันทะ) ถ้าพวกเขาเข้าใจ นั่นคือสิ่งที่ encapsulation เกี่ยวกับนั่นคือสิ่งที่ OO เป็นเรื่องเกี่ยวกับ คุณไม่สามารถแยกความแตกต่างของพร็อกซีจากของจริงได้ตราบใดที่มันตอบสนองตามที่คุณคาดหวัง
คำว่า "ทันสมัย" มากกว่าสำหรับ "การส่งข้อความ" คือ "การกระจายวิธีการแบบไดนามิก" หรือ "การเรียกใช้วิธีการเสมือน" แต่นั่นทำให้คำอุปมาเสียและมุ่งเน้นไปที่กลไก
จุดที่คล้ายกันจะทำยังในการทำความเข้าใจข้อมูลที่เป็นนามธรรมมาเยือนโดยวิลเลียมอาร์คุกและเขาเสนอแบบย่อ, คำจำกัดความที่ทันสมัยของ "วัตถุ" และ "Object Oriented"
การแจกจ่ายแบบไดนามิกของการดำเนินการเป็นลักษณะสำคัญของวัตถุ หมายความว่าการดำเนินการที่จะเรียกใช้เป็นคุณสมบัติแบบไดนามิกของวัตถุเอง ไม่สามารถระบุการดำเนินงานแบบสแตติกและไม่มีวิธีทั่วไปในการดำเนินการใด ๆ ที่จะดำเนินการตามคำขอที่ได้รับยกเว้นโดยการเรียกใช้ สิ่งนี้เหมือนกับฟังก์ชั่นชั้นหนึ่งซึ่งจะถูกส่งแบบไดนามิกเสมอ
ใน Smalltalk-72 ไม่มีแม้แต่วัตถุใด ๆ ! มีเฉพาะสตรีมข้อความที่แยกวิเคราะห์เขียนใหม่และเปลี่ยนเส้นทางใหม่ วิธีมาก่อน (วิธีมาตรฐานในการแยกวิเคราะห์และเปลี่ยนเส้นทางสตรีมข้อความ) มาภายหลังวัตถุ (กลุ่มของวิธีการที่ใช้ร่วมกันบางรัฐส่วนตัว) การสืบทอดมามากในภายหลังและชั้นเรียนได้รับการแนะนำเป็นเพียงวิธีการสนับสนุนการสืบทอด หากกลุ่มวิจัยของเคย์รู้เรื่องต้นแบบแล้วพวกเขาอาจจะไม่เคยแนะนำคลาสในตอนแรก
โปรแกรมเมอร์ทุกคนควรอ่านเข้าใจข้อมูลนามธรรมมาเยือน มันอธิบายในรายละเอียดว่าอะไรคือความแตกต่างระหว่างวัตถุและประเภทข้อมูลนามธรรม เขาให้ตัวอย่างโดยใช้ Java และที่เกี่ยวข้องอย่างยิ่งกับคำถามนี้เพราะทั้งในตัวอย่าง ADT และตัวอย่างวัตถุเขาใช้การสืบทอดการห่อหุ้มและ polymorphism แต่มีเพียงหนึ่งตัวอย่างเท่านั้นที่มุ่งเน้นวัตถุ! กล่าวอีกนัยหนึ่ง: คุณสามารถมีการสืบทอดการห่อหุ้มและ polymorphism คุณสามารถมีทั้งสามอย่างพร้อมกันและยังไม่มี OO
ในทางกลับกันคุณสามารถมี OO ได้โดยไม่มีการสืบทอด เช่นเดียวกับที่ฉันพูดถึงข้างต้น: Smalltalk เวอร์ชันดั้งเดิม (ภาษาที่ออกแบบโดย Alan Kay ผู้ประดิษฐ์คำว่า "การเขียนโปรแกรมเชิงวัตถุ") ไม่มีมรดก
สุดท้าย แต่ไม่ท้ายสุดสนธิสัญญาของออร์แลนโดได้กล่าวถึงการมอบหมายเป็นทางเลือกในการสืบทอดและรูปแบบของการมอบหมายและการสืบทอดที่แตกต่างกันนำไปสู่ประเด็นการออกแบบที่แตกต่างกันภายในพื้นที่การออกแบบของภาษาเชิงวัตถุ (โปรดทราบว่าจริง ๆ แล้วแม้ในภาษาที่สนับสนุนการสืบทอดเช่น Java คนได้รับการสอนให้หลีกเลี่ยงจริง ๆ อีกครั้งบ่งชี้ว่าไม่จำเป็นสำหรับ OO)