คำถามติดแท็ก method-overloading

10
การใช้คอมไพเลอร์ C ++ เป็นเพียงการปฏิบัติที่เกินความจำเป็นหรือไม่
ดังนั้นฉันจึงทำงานเกี่ยวกับการออกแบบซอฟต์แวร์โดยใช้ C สำหรับโปรเซสเซอร์บางตัว ชุดเครื่องมือประกอบด้วยความสามารถในการคอมไพล์ C และ C ++ สำหรับสิ่งที่ฉันทำไม่มีการจัดสรรหน่วยความจำแบบไดนามิกในสภาพแวดล้อมนี้และโปรแกรมโดยรวมค่อนข้างง่าย ไม่ต้องพูดถึงว่าอุปกรณ์มีพลังประมวลผลหรือทรัพยากรเกือบไม่ ไม่จำเป็นต้องใช้ C ++ ใด ๆ เลย ที่ถูกกล่าวว่ามีไม่กี่สถานที่ที่ฉันทำฟังก์ชั่นมากไป (คุณสมบัติของ C ++) ฉันต้องการส่งข้อมูลประเภทต่าง ๆ และไม่รู้สึกอยากใช้printfการจัดรูปแบบสไตล์กับ%sอาร์กิวเมนต์ (หรืออะไรก็ตาม) บางประเภท ฉันเคยเห็นบางคนที่ไม่สามารถเข้าถึงคอมไพเลอร์ C ++ ที่ทำprintfสิ่งนี้ได้ แต่ในกรณีของฉันรองรับ C ++ พร้อมใช้งาน ตอนนี้ฉันแน่ใจว่าฉันอาจได้รับคำถามว่าทำไมฉันต้องโอเวอร์โหลดฟังก์ชันเพื่อเริ่มต้นด้วย ดังนั้นฉันจะพยายามตอบตอนนี้ ฉันต้องส่งข้อมูลประเภทต่าง ๆ ออกจากพอร์ตอนุกรมดังนั้นฉันจึงมีข้อมูลเกินจำนวนเล็กน้อยที่ส่งประเภทข้อมูลต่อไปนี้: unsigned char* const char* unsigned char const char ฉันแค่ไม่อยากมีวิธีการหนึ่งที่จัดการกับสิ่งเหล่านี้ทั้งหมด เมื่อฉันเรียกใช้ฟังก์ชั่นที่ฉันต้องการให้มันส่งออกพอร์ตอนุกรมฉันไม่มีทรัพยากรมากมายดังนั้นฉันจึงไม่ต้องการที่จะทำอะไรเลยนอกจากการส่งสัญญาณของฉัน มีคนอื่นเห็นโปรแกรมของฉันและถามฉันว่า "ทำไมคุณถึงใช้ไฟล์ …

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

5
มันเพียงพอสำหรับวิธีการที่จะโดดเด่นเพียงแค่ชื่ออาร์กิวเมนต์ (ไม่พิมพ์)?
มันเพียงพอสำหรับวิธีการที่จะโดดเด่นเพียงแค่ชื่ออาร์กิวเมนต์ (ไม่พิมพ์) หรือมันจะดีกว่าที่จะตั้งชื่ออย่างชัดเจนมากขึ้น? ยกตัวอย่างเช่นVST Find<T>(int id)T FindById<T>(int id) มีเหตุผลที่ดีที่จะตั้งชื่ออย่างชัดเจนยิ่งขึ้น (เช่นการเพิ่มById) และการเก็บชื่ออาร์กิวเมนต์เพียงอย่างเดียวหรือไม่ เหตุผลหนึ่งที่ฉันคิดได้ก็คือเมื่อลายเซ็นของวิธีการเหมือนกัน แต่มีความหมายแตกต่างกัน FindByFirstName(string name) และ FindByLastName(string name)

2
ทำไมเมธอดที่รับพารามิเตอร์ไม่ จำกัด จำนวนมักกำหนดโอเวอร์โหลดด้วยพารามิเตอร์ที่น้อยลง
ตัวอย่างเช่นSystem.IO.Path.Combineวิธีการใน. NET มีการโอเวอร์โหลดดังต่อไปนี้: Combine(params String[]) Combine(String, String) Combine(String, String, String) Combine(String, String, String, String) จุดสามจุดสุดท้ายคืออะไร? คนแรกจะครอบคลุมพวกเขาทั้งหมดราวกับว่าคุณดูอย่างใกล้ชิดมันใช้paramsคำหลัก อาร์กิวเมนต์ของความเข้ากันได้ย้อนหลังจะครอบคลุมเฉพาะCombine(String, String)ตัวแปรเนื่องจากเป็นรุ่นเดียวจนถึง. NET 4

12
วิธีการมากไปกว่าน้ำตาล syntactic? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา วิธีการบรรทุกเกินพิกัดชนิดของความหลากหลาย? สำหรับฉันดูเหมือนว่าการแยกความแตกต่างของวิธีการที่มีชื่อเดียวกันและพารามิเตอร์ที่แตกต่างกัน ดังนั้นstuff(Thing t)และstuff(Thing t, int n)เป็นวิธีการที่แตกต่างกันอย่างสิ้นเชิงเท่าที่รวบรวมและรันไทม์มีความกังวล มันสร้างภาพลวงตาบนฝั่งของผู้โทรว่ามันเป็นวิธีเดียวกันกับที่ทำหน้าที่แตกต่างกันในวัตถุชนิดต่าง ๆ - polymorphism แต่นั่นเป็นเพียงภาพลวงตาเพราะจริงstuff(Thing t)และstuff(Thing t, int n)วิธีการที่แตกต่างกันอย่างสิ้นเชิง วิธีการมากไปกว่าน้ำตาล syntactic? ฉันพลาดอะไรไปรึเปล่า? ความหมายทั่วไปสำหรับน้ำตาลประโยคคือว่ามันเป็นท้องถิ่นอย่างหมดจด ความหมายการเปลี่ยนชิ้นส่วนของรหัสให้เทียบเท่า 'หวาน' หรือในทางกลับกันเกี่ยวข้องกับการเปลี่ยนแปลงในท้องถิ่นที่ไม่ส่งผลกระทบต่อโครงสร้างโดยรวมของโปรแกรม และฉันคิดว่าวิธีการบรรทุกเกินพิกัดเหมาะสมกับเกณฑ์นี้อย่างแม่นยำ ลองดูตัวอย่างเพื่อสาธิต: พิจารณาชั้นเรียน: class Reader { public String read(Book b){ // .. translate the book to text } public String …

4
เราควรเปลี่ยนชื่อเมธอดที่โอเวอร์โหลดหรือไม่?
สมมติว่าอินเตอร์เฟสมีวิธีการเหล่านี้: Car find(long id); List<Car> find(String model); จะเป็นการดีกว่าถ้าจะเปลี่ยนชื่อพวกเขาเช่นนี้? Car findById(long id); List findByModel(String model); อันที่จริงนักพัฒนาซอฟต์แวร์ใด ๆ ที่ใช้ API นี้ไม่จำเป็นต้องดูที่อินเทอร์เฟซเพื่อรับทราบข้อโต้แย้งที่เป็นไปได้ของfind()วิธีการเริ่มต้น ดังนั้นคำถามของฉันจึงเป็นเรื่องทั่วไปมากขึ้น: อะไรคือประโยชน์ของการใช้วิธีโอเวอร์โหลดในโค้ดเนื่องจากลดความสามารถในการอ่าน

3
วิธีหนึ่งใช้วิธีอื่นมากไปหรือไม่หรือทั้งสองวิธี“ โอเวอร์โหลด”
ถ้าฉันสร้างวิธีนี้ public void foo() จากนั้นฉันก็สร้างเวอร์ชันที่โอเวอร์โหลดเช่นนี้ public void foo( string bar ) เราบอกว่าฟังก์ชั่นที่สองโอเวอร์โหลดครั้งแรกหรือทั้งสองวิธีเท่ากันคือ "โอเวอร์โหลด" สิ่งนี้จะบอกเป็นนัย (ฉันคิดว่า) ว่ามีฟังก์ชั่นประเภทฐานที่ถูกโหลดมากเกินไปโดยฟังก์ชั่นอื่น (คล้ายกับมรดก แต่ไม่ได้จริงๆ) สมมติว่าวิธีหนึ่งสามารถ "โอเวอร์โหลดวิธีอื่น" ก็จะหมายถึงคำเช่น "โอเวอร์โหลด" และ "โอเวอร์โหลด" หากนั่นคือคำใด ๆ แต่นั่นก็ไม่ได้รู้สึกถูกต้องเลยโดยเฉพาะอย่างยิ่งเมื่อคุณมีภาระงานมากเกินไป ฉันมาถึงคำถามนี้เมื่อฉันต้องการเขียนกระบวนการสร้างวิธีโอเวอร์โหลดและฉันต้องการวิธีที่ถูกต้องที่สุดในการจดบันทึก ตัวอย่าง: ฉันบรรทุกเกินพิกัด foo ฉันกำลังมากไปfooด้วยfoo( string bar ) ฉันกำลังสร้างวิธีการโอเวอร์โหลด ฉันกำลังฟูมากเกินไป ดังนั้นใช่ฉันคิดแบบนี้ฉันไม่แน่ใจว่าจะทำอย่างไร มีคำอธิบายของฟังก์ชั่นการทำงานหนักมากเกินไปออนไลน์หลายร้อยหากไม่ใช่ แต่มีเพียงแวบแรกฉันไม่พบที่อยู่นี้

1
ทำไมจึงไม่มีระบบอำนวยความสะดวกในการโอเวอร์โหลดคุณสมบัติคงที่ใน PHP?
Intro PHP อนุญาตให้คุณโอเวอร์โหลดการเรียกใช้เมธอดและการเข้าถึงคุณสมบัติโดยการประกาศเมธอดมหัศจรรย์ในคลาส สิ่งนี้ทำให้รหัสเช่น: class Foo { public function __get($name) { return 42; } } $foo = new Foo; echo $foo->missingProperty; // prints "42" นอกเหนือจากการบรรทุกเกินพิกัดเช่นคุณสมบัติและวิธีการตั้งแต่ PHP 5.3.0 เรายังสามารถเกินวิธีการโทรออกโดยวิธีการเอาชนะมายากลstatic__callStatic บางสิ่งหายไป สิ่งที่ขาดหายไปจากฟังก์ชั่นที่มีอยู่อย่างชัดเจนคือความสามารถในการโอเวอร์โหลดคุณสมบัติสแตติกเช่น: echo Foo::$missingProperty; // fatal error: access to undeclared static property ข้อ จำกัด นี้เป็นอย่างชัดเจนเอกสาร : การโอเวอร์โหลดของคุณสมบัติใช้งานได้เฉพาะในบริบทของวัตถุ วิธีการเวทย์มนตร์เหล่านี้จะไม่ถูกกระตุ้นในบริบทคงที่ staticดังนั้นวิธีการเหล่านี้ไม่ควรได้รับการประกาศ ในฐานะของ PHP 5.3.0 …

2
เกินหรือพารามิเตอร์เสริม
เมื่อฉันมีฟังก์ชั่นที่อาจหรืออาจไม่ได้รับพารามิเตอร์ที่แน่นอนมันจะดีกว่าหรือไม่ที่จะทำงานเกินพิกัดหรือเพื่อเพิ่ม args เพิ่มเติม หากแต่ละคนมีอัพและดาวน์ - ฉันจะใช้แต่ละอันเมื่อใด

3
วิธีการที่มากไปเหมาะสมเมื่อใด
สมมติว่าฉันกำลังทำงานกับระบบที่มีอยู่และมีขนาดใหญ่พอสมควร ฉันมีวัตถุmyObjectของคลาสMyClass(เพื่อประโยชน์ของตัวอย่างสมมติว่าฉันทำงานใน Java) myObjectเป็นองค์ประกอบที่ประกอบด้วย a Collection, say, a Listและวัตถุอื่น ๆ ที่ (ฉันคิดว่า) ไม่เกี่ยวข้อง มันมีวิธีการมอบหมายซึ่งเพียงแค่ให้บริการที่จะเรียกร้องให้วิธีการของListมันประกอบด้วยเพื่อให้แน่ใจว่าListมันจะไม่ได้สัมผัส (ขออภัยถ้าฉันมีคำศัพท์ของฉันผิด) Let 's พูดที่ว่านี้Listเป็นแต่ด้วยเหตุผลบางอย่างที่วิธีการเข้าถึงหลักเป็นวิธีหน้ากากสำหรับการเรียนList<String> SomeOtherClassถ้าผมอยากจะใส่คู่ค่าใหม่เข้าไปในของฉันListแล้วฉันมีวัตถุของที่เรียกว่าSomeOtherClass someObjectฉันต้องการโทรmyObject.insert(someObject)และภายในinsertวิธีการจะมีความมหัศจรรย์บางอย่างที่จะดึงข้อมูลที่จะใส่ลงไปในStringList<String> สมมติว่าตอนนี้ฉันมีStringค่าและไม่มีSomeOtherClassวัตถุที่จะแทรก สมมติว่าฉันไม่สามารถปรับเปลี่ยนinsertวิธีการเพราะมันจะทำลายทุกอย่างในระบบนี้ จากนั้นฉันควรใช้insertวิธีมากเกินไปหรือไม่ หรือฉันควรสร้างวัตถุใหม่ของSomeOtherClassเวลาที่ฉันต้องการที่จะเรียกทุกคนinsert? ฉันเดาว่าถ้าฉันทำมากไปมันจะมีลักษณะเช่นนี้ ... public void insert(String s) { ... } public void insert(SomeOtherObject obj) { this.insert(obj.magicStringMethod()); } (ตัวอย่างนี้เป็นจิ๊กซอว์ที่ออกแบบมาตามสถานการณ์ที่คล้ายกัน (ซับซ้อนกว่าเล็กน้อย) เกี่ยวกับการบรรทุกเกินพิกัดที่ฉันพบเมื่อวานนี้ฉันจะขยายมันหากมีสิ่งใดที่ไม่ชัดเจน) นี่เป็นสถานที่ที่เหมาะสมในการโอเวอร์โหลดเมธอดหรือไม่? ถ้าไม่ฉันควรโอเวอร์โหลดเมธอดเมื่อใด

5
ทำไมไม่อนุญาตให้มีการบรรทุกมากเกินไปกับประเภทการคืนสินค้า (อย่างน้อยก็ในภาษาที่ใช้โดยทั่วไป)
ฉันไม่รู้เกี่ยวกับภาษาการเขียนโปรแกรมทั้งหมด แต่เป็นที่ชัดเจนว่าโดยปกติแล้วความเป็นไปได้ของการโอเวอร์โหลดวิธีที่พิจารณาประเภทการส่งคืน (สมมติว่าอาร์กิวเมนต์เป็นจำนวนและประเภทเดียวกัน) ไม่ได้รับการสนับสนุน ฉันหมายถึงสิ่งนี้: int method1 (int num) { } long method1 (int num) { } ไม่ใช่ว่ามันเป็นปัญหาใหญ่สำหรับการเขียนโปรแกรม แต่บางครั้งฉันก็ยินดีต้อนรับ เห็นได้ชัดว่าไม่มีทางที่ภาษาเหล่านั้นจะสามารถสนับสนุนได้โดยไม่มีวิธีแยกความแตกต่างของวิธีการที่เรียกว่า แต่ไวยากรณ์สำหรับสิ่งนั้นอาจจะง่ายเหมือนอย่าง [int] method1 (num) หรือ [long] method1 (num) วิธีนั้นคอมไพเลอร์จะรู้ว่าจะเป็นอันไหนที่จะถูกเรียก ฉันไม่รู้ว่าคอมไพเลอร์ทำงานอย่างไร แต่มันก็ดูไม่ยากที่จะทำดังนั้นฉันจึงสงสัยว่าทำไมบางสิ่งเช่นนั้นถึงไม่ได้รับการปรับแต่ง อะไรคือสาเหตุที่ทำให้บางอย่างเช่นนั้นไม่รองรับ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.