ในกรณีที่เป็นระบบเชิงวัตถุคุณควรเลือก struct (สไตล์ C) บนคลาสหรือไม่?


9

C และเป็นไปได้ว่าภาษาอื่น ๆ มักจะมีstructคำหลักสำหรับการสร้างโครงสร้าง (หรือบางสิ่งในลักษณะที่คล้ายกัน) เหล่านี้คือ (อย่างน้อยใน C) จากมุมมองแบบง่ายเช่นคลาส แต่ไม่มี polymorphism, inheritance, methods และอื่น ๆ

นึกถึงภาษาเชิงวัตถุ (หรือหลายกระบวนทัศน์) ด้วยโครงสร้าง C-style คุณจะเลือกเรียนที่ไหนดี? ตอนนี้ฉันไม่เชื่อว่าพวกเขาจะต้องใช้กับ OOP เนื่องจากคลาสดูเหมือนจะแทนที่วัตถุประสงค์ของพวกเขา แต่ฉันสงสัยว่ามีสถานการณ์ที่พวกเขาจะได้รับความนิยมมากกว่าคลาสในโปรแกรมเชิงวัตถุหรือในสถานการณ์ประเภทใด มีสถานการณ์เช่นนี้หรือไม่?


คุณใช้ภาษาอะไร คุณกำลังเผยแพร่อะไร ภาษา OO สมัยใหม่ส่วนใหญ่ยกเว้น Java รองรับคุณสมบัติไม่ทางใดก็ทางหนึ่ง
kevin cline

คำตอบ:


16

มีความแตกต่างที่ฉันเคยเห็นในหนังสือบางเล่มระหว่างวัตถุที่มีของรัฐและวัตถุที่ให้ประโยชน์ใช้สอย เงื่อนไขที่แน่นอนแตกต่างจากแหล่งที่มากับแหล่งที่มา แต่โดยทั่วไปแล้วการพูดในอดีตมีความแตกต่างโดยมีพวงของเขตข้อมูลและคู่ของ getters-setters ง่าย ๆ ทั้งคู่ (และอาจเป็นตัวสร้าง)

สิ่งเหล่านี้พบได้ทั่วไปใน Java สำหรับคลาสที่มีการทำเครื่องหมายอย่างชัดเจนว่า "serializable"

ฉันจะยืนยันว่าคลาสประเภทนี้มีความหมายมากที่สุดในฐานะ structs หากคุณรู้สึกว่าไม่จำเป็นต้องซ่อนสมาชิกโดยตรง (เช่นในกรณีของประเภทซ้อนกัน)


1
โรเบิร์ตซีมาร์ตินเรียกพวกเขาว่า "การถ่ายโอนข้อมูลวัตถุ" ในรหัสสะอาด
user16764

5

ใน C ไม่มีคลาสดังนั้นจึงstructเป็นวิธีการรวมข้อมูล ใน C ++ structเป็นเช่นเดียวกับclassยกเว้นว่ามรดกและสมาชิกเข้าถึงโดยค่าเริ่มต้นมากกว่าpublic privateC # ยังมีประเภทของstructแต่ฉันไม่รู้ C # พอที่จะแสดงความคิดเห็นเกี่ยวกับมัน Common Lisp มีdefstructรูปแบบซึ่งทำงานได้เหมือนกับ C structs มากที่สุดเท่าที่จะทำได้โดยคำนึงถึงความแตกต่างของภาษาและมันแตกต่างจากคลาส Common Lisp Object System

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


6
ความแตกต่างระหว่าง a structและ a classนั้นสำคัญกว่าใน C # - สิ่งที่ยิ่งใหญ่structคือ a คือประเภทของค่าและ a classคือประเภทอ้างอิง Microsoft ไม่แนะนำให้ใช้structถ้าเนื้อหาจะมีขนาดใหญ่กว่า 16 ไบต์หรือมากกว่านั้น
Carson63000

0

ในระดับพื้นฐานมากอะไรคือความแตกต่างระหว่าง struct และคลาสข้อมูลบริสุทธิ์ (อันที่ไม่มีฟังก์ชั่นนอกเหนือจาก accessors คุณสมบัติ)

ไม่มีอะไรนอกจากรอยความทรงจำจริงๆ


0

คำตอบที่ยอมรับได้ดี ฉันต้องการเพิ่ม ....

บางครั้งมันจะดีกว่าที่จะวางวิธีการภายในชั้น ในบางครั้งมันจะดีกว่าถ้ามีฟังก์ชั่นภายนอกที่มีการส่งผ่าน struct / class เป็นพารามิเตอร์ (แม้ว่าคุณจะใช้สไตล์ OOP)

ตัวอย่างการใส่เมธอดภายในคลาส: Rectangle.CaclulateArea ()

ตัวอย่างของการใส่ฟังก์ชั่นนอกคลาส: Canvas.Draw (rect rect rect)

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


0

สำหรับฉันความแตกต่างใหญ่คือว่ามีคลาสคงที่หรือไม่

หรือกล่าวอีกนัยหนึ่ง: ฉันมีอิสระที่จะเปลี่ยนฟิลด์ใด ๆ เป็นค่าใดก็ได้ ณ เวลาใด ๆ ถ้าเป็นเช่นนั้นมันเป็น struct; ถ้าไม่ใช่มันเป็นคลาส

ตัวอย่างปกติของ struct คือจุด 2 มิติที่มีสมาชิก X และ Y เท่านั้นที่สามารถมีค่าใด ๆ และเป็นอิสระโดยสิ้นเชิงจากกัน การเข้าถึงสาธารณะเป็นที่ยอมรับ

ตัวอย่างของคลาสคือการรวมกันของตัวชี้ไปยังอาร์เรย์อักขระและเขตข้อมูลความยาว: ความยาวขึ้นอยู่กับค่าของตัวชี้และดังนั้นจึงไม่ควรเป็น struct ฟิลด์ควรเป็นแบบส่วนตัวและการเข้าถึงควรผ่านตัวตั้งค่าและตัวเรียกใช้เพื่อให้แน่ใจว่าคลาสคงที่


0

1) เครือข่ายstructs: โครงสร้างที่ส่งผ่านสาย

โดยทั่วไปและเป็นทางการคลาสใด ๆ ที่คุณต้องการเป็น POD, เบ็ดเตล็ด, เลย์เอาต์มาตรฐานหรือแนวคิดที่เกี่ยวข้อง สำหรับการอภิปรายที่ยอดเยี่ยมของแนวคิดเหล่านี้พร้อมตัวอย่างดูคำตอบนี้ (สำหรับ C ++ 11)

2) Functors (ภาคโดยเฉพาะ) std::remove_ifที่คุณจะผ่านไปถึงฟังก์ชั่นเช่น ใส่มิฉะนั้นชั้นเรียนที่คล้ายกับ / สืบทอดมาจากstd::binary_functionหรือไม่ชอบ

3) แนวคิด Meta-การเขียนโปรแกรมซึ่งอาจมีเพียงประชาชนconstexprs และ / หรือtypedefs

แก้ไข: หมายเหตุ: คำตอบนี้ใช้กับคลาส C ++ กับโครงสร้าง

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