Access Modifiers
ภาวัต แก้วแกมคง 650710091
C#
Access Modifier เป็นส่วนหนึ่งของการทำ Encapsulation เหล่า class, data type หรือ method จะมีระดับการเข้าถึงต่างๆเพื่อควบคุมการเข้าถึง บาง Access Modifier มีไว้สำหรับเพื่อป้องกันไม่ให้ข้อมูลที่สำคัญเข้าถึงได้ หรือมีไว้ให้ สงวนสิทธ์แค่ภายในไฟล์เดียวกันเท่านั้น ในภาษา C# จะมี Access Modifiers อยู่หลักๆ 4 ตัวนั้นคือ public, private, protected และ internal
public : ทุกส่วนสามารถเข้าถึงได้
private : ภายในคลาสเท่านั้นที่สามารถเข้าถึงได้ คลาสอื่นหรือนอกคลาสจะไม่สามารถเข้าได้แม้กระทั่งคลาสลูก
protected : สามารถเข้าได้ทั้งภายในคลาสและคลาสลูก
internal : สามารถเข้าถึงได้จากการที่อยู่ Assembly เดียวกันเท่านั้น(โค้ดทั้งหมดที่อยู่ในไฟล์ที่ถูกคอมไพล์เดียวกัน)
protected internal : สามารถเข้าถึงเมื่ออยู่ Assembly เดียวกัน และ คลาสลูกที่อยู่ทั้งในและ Assembly อื่น
private protected : เข้าถึงได้เฉพาะภายในคลาส และคลาสลูกที่อยู่ Assembly เดียวกัน
file : (ถูกเพิ่มมาหลังจาก C# 11) สามารถเข้าถึงได้เฉพาะภายในไฟล์ซอร์สโค้ดที่ประกาศเท่านั้น จะเป็นคนกรณีกับ Assembly เดียวกัน แบบ internal
ภายในไฟล์
✔
✔
✔
✔
✔
✔
ภายใน class
✔
✔
✔
✔
✔
✖
คลาสลูก (อยู่ assembly เดียวกัน)
✔
✔
✔
✔
✖
✖
ไม่ใช่คลาสลูก (อยู่ assembly เดียวกัน)
✔
✔
✖
✔
✖
✖
คลาสลูก (ไม่ได้อยู่ assembly เดียวกัน)
✔
✔
✔
✖
✖
✖
ไม่ใช่คลาสลูก (ไม่ได้อยู่ aseembly เดียวกัน)
✔
✖
✖
✖
✖
✖
ตัวอย่าง
ข้อสำคัญ
นอกจากความสามารถในแต่ละ Access Modifiers แล้ว ยังมีเรื่องที่ควรรู้ กฏหรือข้อจำกัดบางอย่างสำหรับการใช้ Access Modifiers
class และ struct สามารถกำหนดระดับการเข้าถึงจากทั้ง 6 ประเภทที่กล่าวมาได้ แต่ สมาชิกภายใน struct จะไม่สามารถกำหนดเป็น Access Modifiers ของจำพวก protected ได้ เนื่องจาก struct ไม่ support การสืบทอด
class ลูกที่ได้รับการสืบทอดมาจะไม่สามารถมีระดับการเข้าถึงที่กว้างกว่า class แม่ได้การที่ class ลูกมีระดับการเข้าถึงเป็น public ในขณะที่ class แม่เป็น internal จะส่งผลกระทบทำให้ class แม่ เป็น public
ปกติแล้วระดับการเข้าถึงของสมาชิกภายใน class หรือ struct จะไม่มีความสามารถมากกว่าตัว class หรือ struct ที่เป็นเจ้าของมันได้
หมายความว่าถ้า class หรือ struct ตัวนั้นมีการกำหนด Access Modifiers แล้วตัวสมาชิกภายในจะไม่สามารถกำหนดระดับการเข้าถึงที่กว้างกว่าตัวเจ้าของมันไม่ได้
ทุกชนิดของสมาชิกข้อมูลจำเป็นต้องมีระดับการเข้าถึงอย่างน้อยตัวสมาชิกมันเอง
รวมถึงชนิดข้อมูลที่ถูกใช้เป็น return type หรือ parameter ใน method ที่ต้องไม่น้อยกว่าระดับการเข้าถึงของ method หรือสมาชิกนั้น
ที่ต้องทำแบบนี้ก็เพื่อป้องกันการเข้าถึงข้อมูลที่ถูกซ่อนหรือปิดกั้นจากระดับการเข้าถึงข้อมูลที่กว้างกว่า
เช่น ไม่สามารถมีสมาชิก method ที่ระดับการเข้าถึงเป็น internal ได้ในขณะที่ class ต้นถูกกำหนดไว้เป็น public
ถ้าหากเราไม่ได้ประกาศการระดับการเข้าถึงไว้ จะถูกมองระดับการเข้าถึงไว้เป็น default (internal)
interfaces ที่ถูกประกาศใน namespace จะสามารถกำหนด Access Modifiers ได้เป็น public และ internal
โดยหากไม่ได้มีการกำหนดการเข้าถึงจะถูกตั้งเป็น internal เหมือนกับ class และ struct
สมาชิกภายใน interfaces จะเป็น public โดยเริ่มต้นหากไม่ได้กำหนดไว้
เปรียบเทียบ Access Modifiers ใน C, Java, Python
C :
C ไม่มีการใช้ Access modifier โดยเนื่องจากไม่ใช่ภาษาที่รองรับการเขียนโปรแกรมเชิงวัตถุ (OOP)
C++ :
ในภาษา C++ Access Modifiers มีอีกชื่อเรียกคือ Access Specifiers และมี Access Modifiers อยู่ 3 ตัวได้แก่ public, private และ protected
ภายในคลาส
✔
✔
✔
คลาสลูก
✔
✔
✖
นอกคลาส
✔
✖
✖
Java :
ในภาษา Java เป็นภาษาที่รองรับการเขียนโปรแกรมเชิงวัตถุ (OOP) และมี Access Modifers อยู่ 4 ตัวได้แก่ public, private, protected และ default ซึ่ง default ใน Java จะมีความหมายไม่เหมือนกับของ C# ที่มองว่าเป็น internal และต้องอยู่ assembly เดียวกันถึงจะนับแต่ใน Java default จะเข้าถึงได้ต้องอยู่ใน Package เดียวกันเท่านั้น (Package ใช้สำหรับจัดกลุ่ม class ที่เกี่ยวข้อง เราสามารถจัดกลุ่ม package ต่างไฟล์ด้วยกันได้)
ภายในคลาส
✔
✔
✔
✔
Package เดียวกันและ class ลูก
✔
✖
✔
✔
Package เดียวกันแต่ไม่ใช่ class ลูก
✔
✖
✔
✔
คนละ Package แต่เป็น class ลูก
✔
✖
✔
✖
คนละ Package และไม่ใช่ class ลูก
✔
✖
✖
✖
Python :
เนื่องจากในภาษา Python เป็นภาษาสคริปต์จึงไม่มีคีย์เวิร์ด public, private และ protected แบบใน C# หรือ Java แต่จะใช้สัญลักษณ์ "_" , "__" แทนความหมาย protected และ private ตามลำดับหากไม่ได้มีสัญลักษณ์ 2 อย่าง ดังกล่าวจะมีความหมายได้เป็น public ซึ่งสรุปแล้วภาษา Python สามารถ implement ระดับการเข้าถึงได้ด้วยกัน 3 ตัวได้แก่ public, private และ protected
ภายในคลาส
✔
✔
✔
คลาสลูก
✔
✔
✖
นอกคลาส
✔
✖
✖
คลิปนำเสนอ
Presentation
Reference
C#
-Access Modifiers C#
Microsoft. (ไม่มีวันที่). Access modifiers (C# programming guide). Microsoft Learn. สืบค้นเมื่อ 12 ตุลาคม 2024, จากhttps://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers
default C#
GeeksforGeeks. (ไม่มีวันที่). Access modifiers C#. GeeksforGeeks. สืบค้นเมื่อ 12 ตุลาคม 2024, จาก https://www.geeksforgeeks.org/access-modifiers-in-c-sharp/
C++
Access Modifiers C++
GeeksforGeeks. (ไม่มีวันที่). Access modifiers C. GeeksforGeeks. สืบค้นเมื่อ 12 ตุลาคม 2024, จาก https://www.geeksforgeeks.org/access-modifiers-in-c/
Java
Java packages
W3Schools. (ไม่มีวันที่). packages Java. W3Schools. สืบค้นเมื่อ 12 ตุลาคม 2024, จาก https://www.w3schools.com/java/java_packages.asp Access Modifiers Java
GeeksforGeeks. (ไม่มีวันที่). Access modifiers Java. GeeksforGeeks. สืบค้นเมื่อ 12 ตุลาคม 2024, จาก https://www.geeksforgeeks.org/access-modifiers-java/
Python
Access Modifiers Python
GeeksforGeeks. (ไม่มีวันที่). Access modifiers Python: Public, private, และ protected. GeeksforGeeks. สืบค้นเมื่อ 12 ตุลาคม 2024, จาก https://www.geeksforgeeks.org/access-modifiers-in-python-public-private-and-protected/
Last updated