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

การเข้าถึง
public
protected internal
internal
private protected
private
file

ภายในไฟล์

ภายใน class

คลาสลูก (อยู่ assembly เดียวกัน)

ไม่ใช่คลาสลูก (อยู่ assembly เดียวกัน)

คลาสลูก (ไม่ได้อยู่ assembly เดียวกัน)

ไม่ใช่คลาสลูก (ไม่ได้อยู่ aseembly เดียวกัน)

ตัวอย่าง

//ตัวอย่างของแต่ละ Acess Modifiers ของภาษา C#
/*ให้ class Person มี attribute ในแต่ละตัวที่มี Access Modifiers ต่างกันและมี 
และมี class child ที่สืบทอดมาจาก Person*/

class Person{

  public String name = "John Jenkins"; //บุคคลภายนอกสามารถรับรู้หรือเข้าถึงชื่อของเราได้
  
  private int Salary = 100000; //จำนวนเงินเป็นข้อมูลส่วนตัว ไม่ควรมีใครเข้าถึงได้นอกจากเจ้าของ
  
  internal String phone_Number = "088-888-0088";
  //เบอร์โทรติดต่อสามารถให้คนรู้จักหรือคนภายในบ้านรับรู้เบอร์ได้
  
  protected String Address ="Nakhon Pathom" //ที่อยู่เป็นข้อมูลที่ควรสงวนสิทธิ์ไว้สำหรับคนที่บ้าน
  
  private protected String national_ID = "1-2345-678910-11-1";
  //เลขบัตรประชาชนถือว่าเป็นข้อมูลที่ส่วนตัวพอสมควรแต่เรายอมรับได้หากคนภายในบ้านรับรู้ถึงรหัสบัตรประชาชนของเรา
  
  protected internal String passport_Number = "A123456";
  /* เลขพาสสปอร์ตอาจจะไม่ใช่ข้อมูลที่มีความลับสุดยอดและเราก็อาจจะไม่ได้อยากให้คนภายนอกรับรู้แต่เรายังยอมรับได้
หากเป็นคนในครอบครัวหรือญาติ(class ลูกนอก assembly) รับรู้ถึงเลขพาสสปอร์ตของเรา */

  file String SecretCode = "SECRETInwZa007";
}
class child : Person{
  void call(){
    Console.WriteLine("call to "+ base.phone_number);
  }
  void myAddress(){
    Console.WriteLine("my address is "+ base.Address);
  }
}

class main{
  static void Main(string[] args){
    Person P = new Person();
    child C = new child();
    C.call(); // คลาสลูกสามารถเข้าถึงเบอร์โทรของผู้ปกครองได้เพราะเป็นข้อมูลที่คนสนิทหรือคนรู้จักรับรู้ได้
    
    C.myAddress(); //คลาสลูกสามารถเข้าถึงที่อยู่ของผู้ปกครองได้เพราะเป็นคนในบ้านเดียวกัน
    
    // แต่คลาสลูกจะไม่สามารถเข้าถึงส่วนของ Salary ผู้ปกครองได้เนื่องจากเป็นข้อมูลส่วนตัวของผู้ปกครอง
    
    /* ทั้งนี้หากเป็น Address และ passsport_Number แม้ไม่ได้เป็นคนภายในบ้านเราตรงๆ(เป็นญาติ)
ก็มีสิทธิ์สามารถเข้าถึงข้อมูลดังกล่าวได้เนื่องจากเป็น Access Modifiers ที่อนุญาตให้ class ลูก
นอก assembly เข้าถึงได้ */
  }
}

ข้อสำคัญ

นอกจากความสามารถในแต่ละ 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

การเข้าถึง
public
protected
private

ภายในคลาส

คลาสลูก

นอกคลาส

Java :

ในภาษา Java เป็นภาษาที่รองรับการเขียนโปรแกรมเชิงวัตถุ (OOP) และมี Access Modifers อยู่ 4 ตัวได้แก่ public, private, protected และ default ซึ่ง default ใน Java จะมีความหมายไม่เหมือนกับของ C# ที่มองว่าเป็น internal และต้องอยู่ assembly เดียวกันถึงจะนับแต่ใน Java default จะเข้าถึงได้ต้องอยู่ใน Package เดียวกันเท่านั้น (Package ใช้สำหรับจัดกลุ่ม class ที่เกี่ยวข้อง เราสามารถจัดกลุ่ม package ต่างไฟล์ด้วยกันได้)

การเข้าถึง
public
private
protected
default

ภายในคลาส

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

การเข้าถึง
public
protected _
private __

ภายในคลาส

คลาสลูก

นอกคลาส

คลิปนำเสนอ

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