การตั้งชื่อแพ็คเกจ
ชื่อแพ็คเกจควรหลีกเลี่ยงความขัดแย้งกับแพ็คเกจอื่น ๆ ดังนั้นการเลือกชื่อที่มีความหมายและไม่ซ้ำกันเป็นสิ่งสำคัญในการออกแบบแพ็คเกจ อย่างไรก็ตามโปรแกรมเมอร์ทั่วโลกกำลังพัฒนาแพ็คเกจและไม่มีวิธีที่จะรู้ว่าใครใช้ชื่อแพ็คเกจใดดังนั้นการเลือกชื่อแพ็คเกจเดียวคือปัญหา หากเราพิจารณาว่าแพ็คเกจใช้เฉพาะภายในองค์กรของเราเราสามารถมีผู้ตัดสินภายในเพื่อให้แน่ใจว่าไม่มีชื่อขัดแย้งระหว่างโครงการ
แต่สำหรับโลกทั้งโลกวิธีนี้ไม่ได้ใช้งานได้จริง ตัวระบุแพ็คเกจเป็นชื่อง่าย ๆ และเป็นวิธีที่ดีกว่าเพื่อให้แน่ใจว่าชื่อแพ็คเกจคือการใช้ชื่อโดเมนอินเทอร์เน็ต หาก บริษัท ที่เราทำงานอยู่คือ Magic.lnc และชื่อโดเมนของ บริษัท คือ Magic C.com ดังนั้นการประกาศแพ็คเกจแอตทริบิวต์ควรเป็น:
แพ็คเกจ com.magic.attr; โปรดทราบว่าชื่อโดเมนองค์ประกอบส่วนประกอบที่นี่ถูกจัดเรียงตามลำดับย้อนกลับของชื่อโดเมนทั่วไป
หากเราใช้สำนวนนี้ชื่อแพ็คเกจที่เราใช้จะไม่ขัดแย้งกับคนอื่นยกเว้นความขัดแย้งที่เป็นไปได้ภายในองค์กรของเรา หากมีความขัดแย้งภายในองค์กรของเรา (อาจเป็นองค์กรขนาดใหญ่) เราสามารถใช้ชื่อโดเมนที่เฉพาะเจาะจงมากขึ้นเพื่อให้มีคุณสมบัติเพิ่มเติม บริษัท ขนาดใหญ่หลายแห่งมีโดเมนย่อยภายในเช่นตะวันออกและยุโรปซึ่งสามารถนำมาใช้เพื่อให้มีคุณสมบัติเพิ่มเติมชื่อของแพ็คเกจ:
แพ็คเกจข้าวโพด. magic.japan.attr;
การใช้โซลูชันนี้อาจทำให้ชื่อแพ็คเกจยาวมาก แต่ค่อนข้างปลอดภัย โปรแกรมเมอร์ที่ใช้เทคนิคนี้จะไม่เลือกชื่อแพ็คเกจเดียวกันและโปรแกรมเมอร์ที่ไม่ใช้เทคนิคนี้จะไม่เลือกชื่อที่เราใช้
การเข้าถึงแพ็คเกจ
เมื่อประกาศการเข้าถึงคลาสระดับบนสุดและอินเทอร์เฟซระดับบนสุดในแพ็คเกจมีสองตัวเลือก: การเข้าถึงแพ็คเกจ (แพ็คเกจ) และการเข้าถึงสาธารณะ (สาธารณะ) คลาสหรืออินเทอร์เฟซที่แก้ไขด้วยสาธารณะสามารถเข้าถึงได้ด้วยรหัสนอกแพคเกจในขณะที่ประเภทที่ไม่ได้ตกแต่งด้วยสาธารณะมีขอบเขตแพ็คเกจ: สามารถเข้าถึงได้ด้วยรหัสอื่น ๆ ในแพ็คเกจเดียวกัน แต่พวกเขาถูกซ่อนไว้สำหรับรหัสนอกแพคเกจแม้ในรหัสแพคเกจย่อย เมื่อประกาศประเภทเราควรประกาศประเภทเหล่านั้นที่โปรแกรมเมอร์อื่น ๆ จำเป็นต้องใช้เป็นสาธารณะและซ่อนประเภทเหล่านั้นที่เป็นของรายละเอียดการใช้งานของแพ็คเกจ เทคโนโลยีนี้ช่วยให้เรามีความยืดหยุ่นอย่างมากและเนื่องจากโปรแกรมเมอร์ไม่พึ่งพารายละเอียดการใช้งานประเภทนี้ที่พวกเขาไม่สามารถเข้าถึงได้เราจึงสามารถเปลี่ยนแปลงได้อย่างอิสระเมื่อเราต้องการเปลี่ยนรายละเอียดการใช้งาน
สมาชิกชั้นเรียนที่ไม่ได้ประกาศว่าเป็นสาธารณะการป้องกันหรือส่วนตัวสามารถเข้าถึงได้โดยตรงด้วยรหัสใด ๆ ภายในแพ็คเกจ แต่ถูกซ่อนจากนอกแพ็คเกจ กล่าวอีกนัยหนึ่งตัวปรับเปลี่ยนการเข้าถึงเริ่มต้นคือ "แพ็คเกจ" ยกเว้นสมาชิกของอินเทอร์เฟซและตัวปรับเปลี่ยนการเข้าถึงเริ่มต้นของพวกเขาคือ "สาธารณะ"
ฟิลด์หรือวิธีการที่ไม่ได้ประกาศส่วนตัวภายในแพ็คเกจสามารถเข้าถึงได้โดยรหัสอื่น ๆ ทั้งหมดในแพ็คเกจนั้นดังนั้นคลาสในแพ็คเกจเดียวกันจึงถือว่าเป็น "มิตร" หรือ "เชื่อถือได้" สิ่งนี้ช่วยให้เราสามารถกำหนดเฟรมเวิร์กแอปพลิเคชันที่รวมรหัสที่กำหนดไว้ล่วงหน้าและรหัสตัวยึดตำแหน่งซึ่งรหัสตัวยึดตำแหน่งถูกแทนที่ด้วยคลาสย่อยของคลาสเฟรมเวิร์ก รหัสที่กำหนดไว้ล่วงหน้าสามารถใช้ตัวดัดแปลงการเข้าถึงแพ็คเกจเพื่อให้รหัสการทำงานร่วมกันอื่น ๆ ภายในแพ็คเกจสามารถเข้าถึงได้โดยตรง แต่สำหรับผู้ใช้นอกแพคเกจรหัสเหล่านี้ไม่สามารถเข้าถึงได้ อย่างไรก็ตามแพ็คเกจย่อยของแพ็คเกจที่รหัสเหล่านี้ไม่น่าเชื่อถือและในทางกลับกัน ตัวอย่างเช่นรหัสที่แก้ไขด้วยตัวดัดแปลงการเข้าถึงแพ็คเกจในแพ็คเกจ DIT ไม่สามารถเข้าถึงได้ด้วยรหัสในแพ็คเกจลูก dit.dat และในทางกลับกัน
ดังนั้นแต่ละประเภทกำหนดสามสัญญาที่แตกต่างกัน:
วิธีการเข้าถึงและความคุ้มครอง
เฉพาะวิธีที่สามารถเข้าถึงได้ใน superclasses สามารถเขียนทับในคลาสย่อย หากวิธีการใน superclass ไม่สามารถเข้าถึงได้วิธีการไม่สามารถแทนที่ใน subclass ได้แม้ว่าวิธีการในคลาสย่อยจะมีชื่อเดียวกับวิธีการ เมื่อมีการเรียกวิธีการที่รันไทม์ระบบจะพิจารณาการเข้าถึงและกำหนดว่าการใช้งานของมันกำลังทำงานอยู่
ตัวอย่างที่สร้างขึ้นเป็นพิเศษต่อไปนี้อธิบายได้ชัดเจนยิ่งขึ้น สมมติว่าเราประกาศคลาสนามธรรมในแพ็คเกจ P1:
แพ็คเกจ P1; {AB ABAB ABAB Public Abstract Class AbstractBase Private Void PRI () {print ("stractbase.pri ()"):} void pac () {print ("stractbase.pac ()");} void pro () {print ("stractbase.pro () Void show () pri (); pac (); Pro (); ผับ(); -ในชั้นเรียนนี้เรากำหนด 4 วิธีแต่ละวิธีมีตัวดัดแปลงการเข้าถึงที่แตกต่างกันและร่างกายของวิธีการระบุตัวเองเท่านั้น วิธีการแสดงเรียกวิธี 4 วิธีเหล่านี้ในวัตถุปัจจุบันในทางกลับกัน เมื่อใช้วิธีนี้กับวัตถุย่อยที่แตกต่างกันสามารถอธิบายได้ว่าการใช้วิธีการเหล่านี้เรียกว่า
ตอนนี้เรากำหนดคอนกรีตคลาสซึ่งขยายคลาส AbstractBase แต่อยู่ในแพ็คเกจ P2:
แพ็คเกจ P2; นำเข้า P1.ABSTRACTBASE คลาสสาธารณะ Concretel ขยาย AbstractBase {โมฆะสาธารณะ pri () {print ("concretel.pri ()");} โมฆะสาธารณะ pac () {print ("concretel.pac ()"); pub () {print ("concretel.pub ()");}}วิธีการทั้ง 4 ใน superclass จะถูก redeclared ในชั้นเรียนนี้และการใช้งานของพวกเขามีการเปลี่ยนแปลงซึ่งกำลังรายงานว่าพวกเขาอยู่ในคลาส con-cretel ในเวลาเดียวกันสิทธิ์การเข้าถึงของพวกเขาได้ถูกเปลี่ยนเป็นสาธารณะเพื่อให้รหัสอื่น ๆ เพื่อเข้าถึง เรียกใช้รหัสต่อไปนี้
คอนกรีตใหม่ (). show ():
เอาต์พุตต่อไปนี้จะถูกสร้างขึ้น:
AbstractBase.pri () AbstractBase.pac () Concretel.pro () Concretel.pub ()
เนื่องจากวิธีการส่วนตัว PRI ไม่สามารถเข้าถึงได้โดย subclasses (หรือคลาสอื่น ๆ ) วิธีการแสดงจึงเรียกใช้วิธีการ PRI ในคลาส AbstractBase วิธี PAC ที่มีสิทธิ์การเข้าถึงแพ็คเกจในคลาส AbstractBase ไม่สามารถเข้าถึงได้โดย Concretel ดังนั้นการใช้วิธี PAC ในคลาส Concretel ไม่สามารถแทนที่คำจำกัดความในคลาส AbstractBase ดังนั้นวิธีการแสดงจึงเรียกวิธี AbstractBase.pac วิธี Pro และวิธีการผับสามารถเข้าถึงได้ในคลาสคอนกรีตและยังสามารถเขียนทับได้ดังนั้นวิธีการแสดงจึงเรียกใช้การใช้วิธีการทั้งสองนี้ในคลาสคอนกรีต
ทำตามความหมายเท้าของเราคลาสคอนกรีต 2 เพื่อขยายคอนกรีตคลาสจากนั้นเราวางไว้ในแพ็คเกจเดียวกัน p1 เช่นเดียวกับคลาสนามธรรมเบส ':
แพ็คเกจ P1; นำเข้า P2.Concretel คลาสสาธารณะคอนกรีต 2 ขยาย concretel {โมฆะสาธารณะ pri () {print ("concrete2.pri ()");} โมฆะสาธารณะ pac () {print ("concrete2.pac ()"); Pub () {print ("Concrete2.pub ()");}}เนื่องจากวิธีการในคอนกรีตมีสิทธิ์ในการเข้าถึงสาธารณะจึงสามารถเข้าถึงได้ในคอนกรีต 2 และแต่ละวิธีในคอนกรีต 2 ครอบคลุมวิธีการที่สอดคล้องกันแยกกัน นอกจากนี้เนื่องจากคอนกรีต 2 และ AbstractBase อยู่ในแพ็คเกจเดียวกันวิธี AbstractBase.pac สามารถเข้าถึงได้ในคอนกรีต 2 และวิธีการคอนกรีต 2.PAC สามารถถูกแทนที่ได้ เรียกวิธีการแสดงบนวัตถุคอนกรีต 2 และผลการพิมพ์มีดังนี้:
AbstractBase.pri () Concrete2.pac () คอนกรีต 2.Pro () คอนกรีต 2.pub ()
ในที่สุดเรากำหนดคลาสคอนกรีต 3 เพื่อขยายคลาสคอนกรีต 2 และวางไว้ในแพ็คเกจ P3:
แพ็คเกจ P3 นำเข้า P1.Concrete2; คลาสสาธารณะคอนกรีต 3 ขยายคอนกรีต 2 {โมฆะสาธารณะ pri () {print ("concrete3.pri ()");} โมฆะสาธารณะ pac q {พิมพ์ ("คอนกรีต 3.pac ()");} โมฆะสาธารณะ pro () {print ("concrete3.pro ()"); วัตถุคอนกรีต 3 และผลการพิมพ์มีดังนี้: AbstractBase.PRI () คอนกรีต 3.PAC () คอนกรีต 3.PRO () คอนกรีต () () () () ()วิธีการคอนกรีต 3.PAC ดูเหมือนว่าจะแทนที่วิธี AbstractBase.pac ที่ไม่สามารถเข้าถึงได้ แต่ในความเป็นจริงวิธีคอนกรีต 3.PAC แทนที่วิธีคอนกรีต 2.PAC และวิธีการคอนกรีต 2.PAC แทนที่วิธี AbstractBase.pac โดยการเพิ่มวิธี PAC ในคลาสคอนกรีต 2 ว่ามีสิทธิ์การเข้าถึงสาธารณะสามารถเข้าถึงและเขียนทับโดยคลาสย่อยใด ๆ -