พวก public private protected มันเป็นพวก access modifier หน้าที่ของมันคือการกำหนดการมองเห็นสมาชิกใน class นั้น
จาก class อื่นที่เรียกใช้มัน
public ทำให้คลาสอื่นสามารถมองเห็นสมาชิกของ class ได้
หมายความว่าคลาสอื่นมีสิทธิ์ที่จะเข้ามาแก้ไขข้อมูลใน class ได้อิสระ
class A
{
public static string Name;
}
คลาสอื่นจะมองเห็นสมาชิกของ A โดยอ้างอิง A.Name = "Peter";
private ทำให้คลาสอื่นไม่สามารถมองเห็นสมาชิกของคลาสได้
คนที่จะอ้างอิงสมาชิกของคลาสได้คือตัวมันเองเท่านั้น
class A
{
private static string Name;
}
คลาสอื่นจะมองไม่เห็นสมาชิกของ A ดังนั้น A.Name ="Perter"; จะทำให้เกิด error
นอกจากนี้คลาสอื่นที่สืบทอดคุณสมบัติจากคลาส A ก็จะมองไม่เห็นสมาชิกของ A ที่
ขึ้นต้นด้วย private ด้วย สรุปคือมีแต่ตัวมันเองเท่านั้นที่มีสิทธิ์เข้าถึงได้
protected จะเหมือนกับ private ตรงที่ คลาสอื่นไม่สามารถมองเห็น
สมาชิกของคลาสที่มี keyword ตัวนี้ มีแต่ตัวมันเองเท่านั้นที่จะมองเห็น
และจุดที่แตกต่างจาก private คือคลาสลูก (คลาสที่สืบทอดคุณสมบัติจากคลาส A) จะมองเห็น
สมาชิกของคลาสแม่ (คลาส A) ที่ระบุด้วยคีย์เวิร์ดนี้
class A
{
protected static string Name;
}
class B : A
{
public static string SetName { set{ name = value;} }
public static void Say()
{
Console.WriteLine("Hello" + Name);
}
}
คลาสอื่นจะมองไม่เห็น A.Name ดังนั้น A.Name ="Perter"; จะทำให้เกิด error
แต่ B จะมองเห็น Name เพราะ B สืบทอดคุณสมบัติมาจาก A (B : A คือการสืบคุณสมบัติ)
ดังนั้นเมธอด B.Say() ในคลาส B จึงทำงานได้ เพราะมันมองเห็น Name
ดังนั้น ในกรณีตัวอย่างนี้ถ้าเราต้องการจะตั้งชื่อให้คลาส B เราต้องตั้งผ่าน property SetName
คือ B.SetName = "peter"; ไม่ใช่ B.Name = "peter";
ข้อสังเกตุเราไม่สามารถระบุ B.Name ได้ จะทำให้เกิด Error เหมือนกับใช้ A.Name
เพราะ protected จะเป็นตัวระบุว่าเฉพาะคลาสที่สืบทอดคุณสมบัติเท่านั้นจึงจะมองเห็น
ให้สังเกตุว่า เราระบุ public หน้าเมธอด Say() ทำให้คลาสอื่นมองเห็นเมธอด Say() ในคลาส B
และคลาสอื่นสามารถเรียกใช้งานได้ แต่คลาสอื่นจะมองเห็นเฉพาะเมธอดเท่านั้น ส่วนโค๊ดภายในเมธอดคลาสอื่นจะมองไม่เห็น
หลังจากที่คลาสอื่นเรียกใช้เมธอด B.Say() แล้ว คลาส B จะเรียกใช้ property Name ด้วยตัวมันเอง
เพราะ B สืบทอดมาจากคลาส A และ keyword protected เป็นตัวที่ระบุว่าเฉพาะตัวมันเอง(คลาส A) และคลาสลูกเท่านั้น(ในที่นี้คือคลาส B)
ที่จะมองเห็น property ตัวนี้ ดังนั้น B.Name จึง error แต่ B.SetName และ B.Say() ทำงานได้
จุดที่สังเกตุเพิ่มเติม ตอนเราเขียนโปรแกรมถ้าเราพิมพ์คำว่า Name ในคลาส B จะมี intellisence ขึ้นมามา
แสดงว่ามันมองเห็น property ตัวนี้ แต่ถ้าเราไปเขียน B.Name นอกคลาส B จะไม่มี intellisence ขึ้นมา
และ visual studio ยังแจ้งข้อผิดพลาดอีกด้วย
return คือการบอกให้โปรแกรมรู้ว่าสิ้นสุดการทำงาน แล้วออกจากเมธอดนั้นๆ
class B : A
{
public static string SetName { set{ name = value;} }
public static void Say()
{
Console.WriteLine("Hello" + Name);
return;
}
}
หลังจากที่เรียกใช้งาน B.Say() แล้ว เมื่อโปรแกรมทำงานคำสั่ง Console.writeLine() เสร็จแล้ว
คำสั่งถัดไปมันมาเจอ return มันจะออกจากเมธอดทันที แต่ return ไม่ได้มีแค่บอกให้โปรแกรมสิ้นสุดการทำงานเท่านั้น
เพราะมันสามารถคืนค่ากลับไปนอกเมธอดได้ด้วยเช่น
class B : A
{
public static string SetName { set{ name = value;} }
public static string Say()
{
return "Hello" + Name;
}
}
คำสั่งนี้ return จะคืนค่า "Hello" + Name กลับไปยังอ๊อปเจ็คอื่นที่เรียกใช้มัน แล้วออกจากโปรแกรม
ให้สังเกตุ return type ของ เมธอดด้วยในที่นี้กำหนดเป็น string ปรกติแล้วถ้า return type ไม่ได้กำหนดเป็น void
นั้นหมายความว่า return ต้องทำหน้าที่มากกว่าแค่ออกจากโปรแกรม แต่มันยังต้องคืนค่าออกจากโปรแกรมด้วย
ส่วนจะคืนค่าอะไรนั้นก็อยู่ที่ตอนประกาศ return type ของเมธอดว่าเป็นชนิดไหน ในที่นี้กำหนดให้เป็น string
อ้างอิง : http://pantip.com/topic/31222929
เพิ่มเติม : http://www.codeproject.com/Articles/25078/C-Access-Modifiers-Quick-Reference
ไม่มีความคิดเห็น:
แสดงความคิดเห็น