ชั้นเรียนบางส่วนที่กำลังแยกต่างหาก


154

เป็นไปได้ที่จะมีสองส่วน (เนมสเปซเดียวกัน, ชื่อคลาสเดียวกัน) ไปยังคลาสบางส่วนใน DLLs แยกกันหรือไม่?


เหมือนคนอื่น ๆ บอกว่ามันเป็นไปไม่ได้ แต่มีวิธีการเสริมชั้นเรียนที่มีพฤติกรรมใหม่จากแหล่งที่แตกต่างกันสิ่งที่คุณต้องการจะทำใน dll ที่แตกต่างกัน?
Ozan

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

คำตอบ:


232

จากMSDN - คลาสส่วนบุคคลและวิธีการ :

คำจำกัดความบางส่วนทั้งหมดหมายถึงการเป็นส่วนหนึ่งของประเภทเดียวกันจะต้องกำหนดไว้ในการชุมนุมที่เหมือนกันและโมดูลเดียวกัน (ไฟล์. exe หรือ. dll) คำจำกัดความบางส่วนไม่สามารถครอบคลุมหลายโมดูล


36

ไม่คลาสบางส่วนเป็นคุณสมบัติทางภาษาล้วนๆ เมื่อรวบรวมแอสเซมบลีไฟล์จะรวมกันเพื่อสร้างประเภท ไม่สามารถกระจายไฟล์ออกเป็นแอสเซมบลีที่แตกต่างกัน

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



8

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

ไม่เพียงแค่นั้นคลาสเหล่านั้นในชุดประกอบอื่น (และลูก ๆ ) จะต้องมีการคอมไพล์ใหม่เพื่อให้สามารถใช้งานได้ ดังนั้นจึงเป็นเหตุผลที่เป็นไปไม่ได้ที่จะอนุญาตให้แบ่งคลาสผ่านชุดประกอบที่แตกต่างกัน


หนึ่งสามารถยุ่งกับสมาชิกส่วนตัวผ่านการสะท้อนถ้าจำเป็นจริง ๆ ไม่สามารถแยกคลาสระหว่างชุดประกอบได้เนื่องจากไม่อนุญาตให้ใช้การอ้างอิงแบบวงกลมและจำเป็นต้องมีเพื่อให้ส่วนต่างๆของชั้นเรียนมีปฏิสัมพันธ์
Zar Shardan

6

คุณสามารถใช้วิธีการขยายเมื่อคุณต้องการเพิ่มวิธีการในชั้นเรียนใน dll ที่แตกต่างกัน ข้อเสียเปรียบอย่างหนึ่งของวิธีนี้คือคุณไม่สามารถเพิ่มวิธีการคงที่ได้


3

คำถามคือทำไมคุณต้องการสร้างคลาสบางส่วนในการประชุมอื่น? คุณสามารถกำหนดคลาสนามธรรมและอินเทอร์เฟซข้ามแอสเซมบลีบางทีคุณอาจต้องดู


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

3
ไม่, ทำไมไม่เพียง แต่สืบทอดจากคลาสนั้นและประกาศคุณสมบัติของคุณด้านบน? คุณสามารถเรียกมันว่าชื่อเดียวกันหากคุณต้องการ
Gleno

0

คุณอาจต้องการสร้างคลาส Wrapper ภายในไลบรารีของคุณเองรอบ ๆ คลาสในไลบรารีส่วนที่ 3 จากนั้นเพิ่มฟังก์ชันการทำงานอะไรก็ได้ในคลาส wrapper

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