คำถามติดแท็ก access-modifiers

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


7
การเข้าถึงของสมาชิกแบบ "แพ็กเกจส่วนตัว" ไม่ตรงกันกับการเข้าถึงเริ่มต้น (ไม่มีตัวแก้ไข) ใช่หรือไม่
ฉันสับสนเล็กน้อยเกี่ยวกับคำว่า "แพ็กเกจส่วนตัว" ที่เอกสารบางส่วนใช้ร่วมกับการใช้ "การเข้าถึงเริ่มต้น" การเข้าถึงแบบแพ็กเกจส่วนตัวและค่าเริ่มต้นไม่ตรงกันกับการป้องกันหรือไม่?

7
วิธีส่วนตัวปลอดภัยจริงหรือ?
ใน Java privateตัวปรับการเข้าถึงถือว่าปลอดภัยเนื่องจากมองไม่เห็นภายนอกคลาส แล้วโลกภายนอกก็ไม่รู้เกี่ยวกับวิธีการนั้นเช่นกัน แต่ฉันคิดว่าการสะท้อนของ Java สามารถใช้เพื่อทำลายกฎนี้ได้ พิจารณากรณีต่อไปนี้: public class ProtectedPrivacy{ private String getInfo(){ return "confidential"; } } จากคลาสอื่นฉันจะได้รับข้อมูล: public class BreakPrivacy{ public static void main(String[] args) throws Exception { ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy(); Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null); method.setAccessible(true); Object result = method.invoke(protectedPrivacy); System.out.println(result.toString()); } } ในขณะนี้ฉันคิดว่าวิธีการส่วนตัวยังปลอดภัยเนื่องจากจะทำบางสิ่งเช่นข้างต้นเราต้องรู้ชื่อวิธีการ แต่ถ้าคลาสที่มีเมธอดส่วนตัวที่เขียนโดยคนอื่นเราไม่สามารถมองเห็นได้ …

2
Initializer ไม่สามารถเข้าถึงได้เนื่องจากระดับการป้องกัน "ภายใน"
ฉันมีโปรโตคอลบางอย่าง เข้าสู่ระบบกลยุทธ์ public protocol LoginStrategy { func login(_ viewController: UIViewController) func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ()) func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ()) func getUserId() -> String } และสองคลาส: เข้าสู่ระบบ public class LoginProvider { public let strategy: LoginStrategy public func login(_ …

5
บล็อกแบบคงที่ใน Java ไม่ได้ดำเนินการ
class Test { public static void main(String arg[]) { System.out.println("**MAIN METHOD"); System.out.println(Mno.VAL); // SOP(9090); System.out.println(Mno.VAL + 100); // SOP(9190); } } class Mno { final static int VAL = 9090; static { System.out.println("**STATIC BLOCK OF Mno\t: " + VAL); } } ฉันรู้ว่าstaticบล็อกทำงานเมื่อโหลดคลาส แต่ในกรณีนี้ตัวแปรอินสแตนซ์ภายในคลาสMnoคือfinalเนื่องจากว่าstaticบล็อกไม่ทำงาน เหตุผลที่เป็นเช่นนั้น? แล้วถ้าจะเอาออกfinalมันจะใช้ได้ไหม หน่วยความจำใดจะถูกจัดสรรก่อนstatic finalตัวแปรหรือstaticบล็อก? หากเนื่องจากfinalตัวแก้ไขการเข้าถึงคลาสไม่ได้รับการโหลดตัวแปรจะรับหน่วยความจำได้อย่างไร?

1
นามแฝงสาธารณะสำหรับประเภทที่ไม่ใช่สาธารณะ
ฉันสงสัยว่ามันถูกต้อง C ++: class Test { struct PrivateInner { PrivateInner(std::string const &str) { std::cout << str << "\n"; } }; public: using PublicInner = PrivateInner; }; //Test::PrivateInner priv("Hello world"); // Ok, private so we can't use that Test::PublicInner publ("Hello World"); // ?, by using public alias we can access private …

1
การใช้ตัวดัดแปลงการเข้าถึงสมาชิกที่ จำกัด น้อยกว่าตัวดัดแปลงการเข้าถึงคลาสคืออะไร?
ว่าฉันมีชั้นเรียนที่มีสมาชิกบางคนและสมาชิกมีตัวดัดแปลงการเข้าถึงที่ จำกัด น้อยกว่าชั้นเรียน ตัวอย่างที่เป็นรูปธรรมอาจเป็น: package apples; class A { // package private public int foo() { // public (=> less restrictive than *package private*) return 42; } } เพื่อความเข้าใจของฉันระดับปรับปรุงการเข้าถึงที่เป็นที่เข้มงวดมากขึ้นกว่าสมาชิกปรับปรุงการเข้าถึงจะแทนที่ข้อ จำกัด น้อยกว่าสมาชิกปรับเปลี่ยนการเข้าถึง ดังนั้นข้อ จำกัด น้อยกว่าสมาชิกปรับปรุงการเข้าถึงควรจะมีผลที่ทุกคน ความเข้าใจของฉันถูกต้องหรือไม่ ถ้าไม่จะเกิดอะไรขึ้น อะไรคือเหตุผลที่ถูกต้องที่จะมีตัวดัดแปลงการเข้าถึงสมาชิกที่ จำกัด น้อยกว่า ในที่สุดมีวิธีปฏิบัติที่ดีที่สุดในการติดตามคืออะไร ฉันยังทำการทดลองบางอย่างเพราะฉันคิดว่ามันอาจมีผลตามมาเมื่อฉันเริ่มส่งการอ้างอิงฟังก์ชั่นไปรอบ ๆ อย่างไรก็ตามถึงกระนั้นตัวดัดแปลงการเข้าถึงก็ดูเหมือนจะไม่สำคัญ สถานการณ์ที่ฉันสร้างขึ้นมีดังนี้: apples.Bมีวิธีการที่ประชาชนที่ส่งกลับอ้างอิงถึงbla()apples.A.foo จากนั้นpizzas.Cเรียกapples.B.blaเพื่อขอรับการอ้างอิงA.fooและเรียกใช้ ดังนั้นA.foo()ไม่สามารถมองเห็นได้โดยตรงCแต่สามารถเข้าถึงได้ทางอ้อมเท่านั้นB.bla() ฉันทดสอบแล้วและมันก็ไม่ได้สร้างความแตกต่างไม่ว่าฉันจะปรับปรุงการเข้าถึงของfoo() แพคเกจส่วนตัวหรือไม่ package …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.