ฉันเห็นข้อความหลายครั้งเช่น - โปรดทำให้คุณลักษณะนี้เป็นพลเมืองชั้นหนึ่งด้วยภาษา / แพลตฟอร์ม " ตัวอย่างเช่นมีการพูดเกี่ยวกับ enums ใน C # /. net ดังนั้นคุณสมบัตินี้จึงถูกพิจารณาว่าเป็น "พลเมืองชั้นหนึ่ง" ในภาษาโปรแกรม / แพลตฟอร์ม?
ฉันเห็นข้อความหลายครั้งเช่น - โปรดทำให้คุณลักษณะนี้เป็นพลเมืองชั้นหนึ่งด้วยภาษา / แพลตฟอร์ม " ตัวอย่างเช่นมีการพูดเกี่ยวกับ enums ใน C # /. net ดังนั้นคุณสมบัตินี้จึงถูกพิจารณาว่าเป็น "พลเมืองชั้นหนึ่ง" ในภาษาโปรแกรม / แพลตฟอร์ม?
คำตอบ:
คำนิยาม
วัตถุเป็นชั้นหนึ่งเมื่อ:
- สามารถเก็บไว้ในตัวแปรและโครงสร้างข้อมูล
- สามารถส่งผ่านเป็นพารามิเตอร์ไปยังรูทีนย่อย
- สามารถส่งคืนเป็นผลมาจากรูทีนย่อย
- สามารถสร้างได้ที่รันไทม์
- มีตัวตนที่แท้จริง (เป็นอิสระจากชื่อที่กำหนด)
คำว่า "วัตถุ" ถูกนำมาใช้อย่างหลวม ๆ ที่นี่ไม่จำเป็นต้องอ้างถึงวัตถุในการเขียนโปรแกรมเชิงวัตถุ ประเภทข้อมูลสเกลาร์ที่ง่ายที่สุดเช่นจำนวนเต็มและจำนวนจุดลอยตัวนั้นเกือบจะเป็นชั้นหนึ่งเสมอ
แนวคิดของ"พลเมืองชั้นหนึ่ง" หรือ "องค์ประกอบชั้นหนึ่ง"ในภาษาโปรแกรมได้รับการแนะนำโดยนักวิทยาศาสตร์คอมพิวเตอร์ชาวอังกฤษChristopher Stracheyในทศวรรษที่ 1960 ในบริบทของฟังก์ชั่นชั้นหนึ่ง สูตรที่โด่งดังที่สุดของหลักการนี้น่าจะอยู่ในโครงสร้างและการตีความของโปรแกรมคอมพิวเตอร์โดย Gerald Jay Sussman และ Harry Abelson:
- อาจถูกตั้งชื่อโดยตัวแปร
- อาจถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังโพรซีเดอร์
- อาจถูกส่งคืนเป็นผลลัพธ์ของขั้นตอน
- อาจรวมอยู่ในโครงสร้างข้อมูล
โดยทั่วไปหมายความว่าคุณสามารถทำอะไรกับองค์ประกอบภาษาการเขียนโปรแกรมนี้ทุกสิ่งที่คุณสามารถทำได้กับองค์ประกอบอื่น ๆ ทั้งหมดในภาษาการเขียนโปรแกรม
มันคือทั้งหมดที่เกี่ยวกับ "สิทธิที่เท่าเทียมกัน": คุณสามารถทำทั้งหมดข้างต้นด้วยพูดจำนวนเต็มดังนั้นทำไมสิ่งอื่น ๆ ควรจะแตกต่างกัน?
คำจำกัดความข้างต้นเป็นข้อ จำกัด เล็กน้อยในแง่ที่ว่ามันพูดถึงแง่มุมของความมีระดับแรกเท่านั้นที่เกี่ยวข้องกับการเป็นวัตถุของโปรแกรม คำจำกัดความทั่วไปที่มากกว่านั้นก็คือสิ่งนั้นเป็นชั้นหนึ่งหากคุณสามารถทำทุกอย่างด้วยมันได้คุณสามารถทำสิ่งอื่นที่มีลักษณะคล้ายกันได้
ตัวอย่างเช่นตัวดำเนินการ Java และวิธีการ Java มีชนิดที่คล้ายกัน คุณสามารถกำหนดวิธีการใหม่คุณสามารถ (บ้าง) เลือกชื่อของวิธีการของคุณเองได้อย่างอิสระคุณสามารถแทนที่วิธีการคุณสามารถวิธีการมากเกินไป James Gosling สามารถทำทุกสิ่งกับผู้ให้บริการได้เช่นกัน แต่คุณและฉันทำไม่ได้ ฉันหมายความว่าขัดกับความเชื่อที่นิยม, Java ไม่มากไปประกอบการการสนับสนุน: ตัวอย่างเช่น+
ผู้ประกอบการมากเกินไปสำหรับbyte
, short
, int
, long
, float
, double
และString
และ IIRC ใน Java 7 ยังBigInteger
และBigDecimal
(และอาจจะคู่ฉันลืม) ก็เพียงแค่ว่าคุณไม่มีอิทธิพลใด ๆ กับมัน นั่นทำให้ผู้ประกอบการระดับที่สองอย่างชัดเจนตามคำจำกัดความที่สองนี้ โปรดทราบว่าวิธีการยังคงไม่ใช่วัตถุชั้นหนึ่งตามคำจำกัดความแรก (นั่นทำให้ผู้ประกอบการชั้นที่สาม?)
โดยทั่วไปนี่หมายถึงโครงสร้างที่สามารถผ่านได้เป็นพารามิเตอร์สามารถกำหนดเป็นชนิดส่งคืนจากฟังก์ชันหรือสามารถกำหนดค่าได้ โดยปกติคุณจะต้องสามารถสร้างมันได้ที่รันไทม์ ตัวอย่างเช่นอินสแตนซ์ของคลาสจะเป็นพลเมืองชั้นหนึ่งใน c ++ หรือ java แต่ฟังก์ชั่นใน C จะไม่เป็น
ฉันจะบอกว่าคุณสมบัติเป็นพลเมืองชั้นหนึ่งหากมีการใช้งานโดยภาษาเท่านั้น
เช่นมันไม่จำเป็นต้องมีคุณสมบัติหลายภาษาหรือห้องสมุดมาตรฐานในการใช้คุณสมบัตินั้น
ตัวอย่าง:
ใน C / C ++ ฉันไม่คิดว่าฟังก์ชั่นเป็นพลเมืองชั้นหนึ่ง (คนอื่นอาจ)
นี่เป็นเพราะมีวิธีการจัดการกับฟังก์ชั่นที่ได้รับการสนับสนุนโดยตรงจากภาษาน็อต แต่ต้องใช้คุณสมบัติภาษาอื่น ๆ ไม่สนับสนุนพารามิเตอร์การผูกกับฟังก์ชันโดยตรงและคุณต้องสร้าง functor เพื่อนำคุณลักษณะนี้ไปใช้
ในการเพิ่มตัวอย่างให้กับคำตอบที่มีให้แล้ว:
ใน WCF / C # ขณะนี้คุณต้องทำเครื่องหมายวัตถุคลาสด้วยแอตทริบิวต์สัญญาบริการเพื่อให้มันทำงานเป็นบริการ ไม่มีสิ่งเช่น:
public **service** MyService (in relation public **class** MyClass).
คลาสเป็นพลเมืองชั้นหนึ่งใน c # ซึ่งไม่ได้ใช้บริการ
หวังว่านี่จะช่วยได้