OOP C# Syntax #2: การมองเห็นตัวแปร/Functions

    หน้านี้เป็นเรื่องสืบเนื่องจาก OOP C# Syntax #1: Class ถ้ายังไม่ได้อ่านกรุณากลับไปอ่านก่อน ก่อนไปดูให้ลึกเกี่ยวกับการมองเห็น  ผมขอทำความเข้าใจกันหน่อยครับ คือว่าไม่ว่าตัวแปร, function, class หรือ object ก็ตามทุกสิ่งทุกอย่างเหล่านี้ล้วนเก็บอยู่ใน memory เหมือนกัน ถ้าภาษานั้นยอมให้มองเห็นกันมันก็ย่อมจะทำได้ แต่เขาไม่ทำกันครับ เพราะถ้าเห็นกันหมดมันจะยุ่งมาก คนเขียนโปรแกรมจะสับสนงงไปหมด ทุกภาษาจึงพยายามซ่อนตัวแปรที่ไม่เกี่ยวข้องออก เพื่อลดความผิดพลาดที่อาจเกิดขึ้นได้ ประเด็นที่ผมอยากจะพูดถึงก็คือ การที่ตัวแปรถูกซ่อนนั้นไม่ใช่เป็นข้อจำกัดของภาษา แต่เป็นความตั้งใจ เพื่อลดปัญหาที่จะเกิดขึ้นครับ

 เรามาเริ่มกันตรงรูปเดิมครับ ก่อน Run โปรแกรมใดๆ ก็ตาม มันจะได้รูปนี้ครับ

class.jpg (22128 bytes)

    จะเห็นได้ว่า ใน class Producer นั้น มีตัวแปร/function ที่สามารถเรียกได้จากนอก class คือ x และ func2() ดังนั้นนั้นเราอยู่ที่ class Consumer ใน Main() เราสามารถเขียนดังนี้ได้

public static void Main()
{
   Producer.x = 5;
   Producer.func2();	
}

    จะเห็นได้ว่าวิธีการเรียกใช้  function/ตัวแปร ที่เป็น static นั้น เราต้องเรียกผ่านชื่อ class โดยใช้ชื่อ class นำแล้วตามด้วยจุด และสุดท้ายคือชื่อ function/ตัวแปร แต่สังเกตนะครับถึงแม้เป็น static เหมือนกัน เราก็ไม่สามารถเรียกใช้ z และ func() ได้ ก็เพราะว่ามันเป็น private ภายนอกจะมองไม่เห็นครับ 

    ถ้าใน code ของคุณเขียนอยู่ใน func() หรือ func2() คุณสามารถเรียกใช้ x, z, func() หรือ func2() ได้หมด เพราะว่าถือว่า เป็น code ที่อยู่ใน class เดียวกัน แบบนี้พอเข้าใจไหมครับ

    ทีนี้เรามาดูกันต่อสมมุติใน Main() มีการสร้าง instance ของ Producer ดังนี้

public static void Main()
{
   Producer  p = new Producer(10);
   Producer q = new Producer(15);	
}

    แบบนี้ถามว่าใน Main() เรียกใช้อะไรจาก p หรือ q ได้บ้าง ก่อนที่ตอบคำถามเรามาดูรูปกันก่อน

pq.jpg (32001 bytes)

        จากรูปเราจะเห็น ว่ามี object เกิดใหม่สองตัว คือ p และ q code ปัจจุบันเราอยู่ใน Main() ดังนั้น สิ่งที่เรามองเห็นก็คือ ตัวที่เป็น public คือ y และ func3() ส่วน w และ world(int) เรียกผ่านจาก Main() ไม่ได้ครับ เรามาดูวิธีเรียกใช้กัน

 

public static void Main()
{
   Producer  p = new Producer(10);
   Producer q = new Producer(15);	
   p.y = 15;
   p.func3();
   q.y = 20;
   q.func3();
}

    วิีธใช้ก็ให้เรียกผ่านตัวแปรที่เป็น referece ไปยัง object แล้วตามด้วยจุด และชื่อ funcion/ตัวแปร ข้อสังเกตคือ p และ q นั้นเป็นอิสระต่อกัน เก็บอยู่คนละ object ดังนั้น ถ้าแก้อะไรใน p ก็จะไม่กระทบใน q

    ถ้า code โปรแกรมของเราอยู่ที่ Producer(int)  , func3(), หรือ world(int) จะสามารถเรียกใช้ y, w, Producer, func3() หรือ world(int) ได้หมด

ถ้ามาจาก class เดียวกันจะเรียกใช้กันได้หรือไม่

    ผมขอแยกเป็นกรณีต่างๆ ดังนี้

    คำตอบคือว่าเรียกใช้ได้หมดครับ เราถือว่า ถ้ามาจาก class เดียวกันย่อมต้องไม่มีความลับต่อกัน ภาษา C# เลยทะลุกำแพงที่บังออกให้หมดครับ เรามาดูกันแต่ละกรณี

function ของ class เรียกใช้ private ของ object

   สมมุติว่าเรากำลังเขียน code อยู่ที่ func()  ของ Producer ดังนี้

public static void func() 
{ 
   Producer p = new Producer(15);
   p.w = 25;	
}

   จะเห็นได้ว่า เมื่อเราอยู่ใน func() ซึ่งเป็น function ของ class เราสามารถล้วงค่า ใน object มาใช้งานได้

function ใน object เีรียก private ของ class

    คราวนี้สมมุติว่าเราเขียน code ใน func3() และต้องการใ่ช้ค่าใน class เราเขียนแบบนี้ครับ

public void func3() 
{ 
   Producer.z = 20;
}

function ใน object เรียก private ของ object

public void func3() 
{ 
   Producer p = new Producer(15);
   p.w = 25;
}

จากตัวอย่างที่ผมยกมา ดูจะประยุกต์ได้ยากหน่อย ใน object สร้าง object เดียวกัน มันค่อยจะเห็นกันมากนอกจากเป็นโปรแกรมแบบ recursive ผมมีตัวอย่างที่ใกล้เคียงความจริงหน่อยในบทถัดไปครับ

ก่อนจบบทนี้ผมขอเขียนเรื่องเก็บตกหน่อยมิฉะนั้นมันจะไม่ครบถ้วน