คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 2
พวก 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
จาก 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
แสดงความคิดเห็น
สอบถามเรื่องkeyword กับ statement ใน C#