30 ต.ค. 2557

public private protected (OOP)

พวก 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

ไม่มีความคิดเห็น: