ตอน 21 Method

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

เว็บไซต์นี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ "เรียนรู้ด้วยตนเอง OOP C# ASP.NET" ครอบคลุม บทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) เนื้อหาในBlog อาจอาจแตกต่างจากในหนังสือเพราะเป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (edit)

กดที่นี่เพื่อดูรายละเอียดเนื้อหาในแต่ละบท

กดที่นี่เพื่อไปยังเว็บบอร์ด ถาม-ตอบ 

 

Method

method (เมธอด) คือสมาชิกอีกแบบหนึ่งของคลาสและ struct ทำหน้าที่เป็นตัวประมวลผลเพื่อให้เกิดการทำงานตามความต้องการ method เป็นบล็อกของโค้ดที่มีคำสั่งเรียงกันตั้งแต่หนึ่งบรรทัดจนถึงหลายสิบบรรทัด บล็อกเริ่มจากเครื่องหมายปีกกาเปิด และจบบล็อกที่เครื่องหมายปีกกาปิด

ที่ส่วนหัวของ method เราต้องเขียนข้อกำหนดของ method ซึ่งประกอบด้วย access level(ระดับการเข้าถึง เช่น public, private) return type (เช่น int สำหรับเลขจำนวนเต็ม หากไม่มี return value ให้ใส่คำว่า void) ชื่อของ method และพารามิเตอร์ หากไม่มีพารามิเตอร์จะต้องใส่เครื่องหมายวงเล็บเปิดและปิดว่างๆ ไว้ หากมีพารามิเตอร์ต้องนิยาม type และชื่อของพารามิเตอร์ไว้ภายในวงเล็บ หากมีพารามิเตอร์หลายตัว ให้คั่นด้วยเครื่องหมายจุดลูกน้ำ (comma จุลภาค) โปรดพิจารณาตัวอย่างการนิยาม method ต่อไปนี้

    class StarShip
    {
        public void StartEngine() { }
        public void AddGas(int gallons) { }
        private int Drive(int miles, int speed) { return 0; }
    }

นี่คือนิยามคลาสชื่อ StarShip ภายในคลาสนี้มี method สมาชิกทั้งหมดสาม method คือ StartEngine, AddGass และ Drive ตามลำดับ แต่ละ method มีรายละเอียดการนิยามดังนี้

  • StartEngine: มี access level เป็น public มี return type เป็น void (คือไม่มี return type) และไม่มีพารามิเตอร์
  • AddGas: มี access level เป็น public มี return type เป็น void (คือไม่มี return type) มีพารามิเตอร์หนึ่งตัวเชื่อ gallons มี type เป็น int
  • Drive: มี access level เป็น private มี return type เป็น int มีพารามิเตอร์สองตัวคือ miles และ speed ซึ่งมี type เป็น int ทั้งคู่ โปรดสังเกตคำสั่ง return ซึ่งต้องมีหาก method นั้น return type ไม่ใช่ void

ตัวอย่างโค้ดที่เรียกใช้ method Drive เป็นดังนี้

    class Program
    {
        static void Main(string[] args)
        {
            SpaceShip myShip = new SpaceShip();
            int foo = myShip.Drive(10, 100);
        }
    }

เนื่องจาก method Drive เป็น method สมาชิกของคลาส SpaceShip เราจึงต้องสร้าง object ที่มี type เป็น SpaceShip ก่อนจึงจะเรียกใช้ method Drive ได้ การเรียกใช้ให้ใส่ชื่อ object ตามด้วยเครื่องหมายจุด ชื่อ method และตามด้วยพารามิเตอร์ในวงเล็บ โดยจำนวนของพารามิเตอร์ต้องตรงกับที่นิยามไว้

ต่อไปนี้เป็นข้อควรคำนึงบางประการเมื่อจะเขียนนิยาม method

  • เราสามารถประกาศตัวแปรภายใน method ได้ ตัวแปรที่ประกาศไว้ภายใน method จะถือว่าเป็นตัวแปรท้องถิ่นของ method (method local variable) ซึ่งจะเกิดและตายภายใน method เท่านั้น (คือมี ขอบเขต หรือ scope อยู่เพียงแค่ภายใน method)
  • การเขียนโปรแกรมภาษา C# เราอาจใช้ method อย่างพลิกแพลงตามหลักการ OOP ได้ครบทุกอย่างคือ
    • เราอาจนิยาม method ชื่อเดียวกัน ภายในคลาสเดียวกันหลายๆ ชุดได้ (แต่ signature ต้องไม่เหมือนกัน) เรียกการทำเช่นนี้ว่า method overloading
    • เราสามารถนิยาม method ใน derived class ซ้ำกับ method ใน base class ได้หากใช้ร่วมกับ keyword new เรียกการทำเช่นนี้ว่า method hiding
    • หาก method ใน base class เป็นแบบ virtual เราสามารถนิยาม method ใน derived class ซ้ำโดยให้เป็นแบบ override เรียกการทำเช่นนี้ว่า method overriding

โปรดอ่านรายละเอียดเรื่อง method overloading, method hiding และ method overriding ในหัวข้อของเรื่องนั้นๆ

 

Adres Hejlsberg บิดาแห่งภาษา C# ได้รับรางวัล Execllence in Programming ของนิตยสาร Dr. Dobb ในปี 2001

 

constructor

constructor (อ่านว่าคอนสทรักเตอร์ แปลว่าผู้สร้าง ต่อไปจะเรียกย่อว่า mc) คือ method พิเศษในคลาส ซึ่งจะทำงานทันทีที่เราสร้าง object โดยการใช้คำสั่ง new ลองดูตัวอย่างโค้ดต่อไปนี้

1  class FooBar
2  {
3      int i;
4      public FooBar()
5      {
6          i = 1;
7      }
8  }
9
10 class Program
11 {
12     static void Main(string[] args)
13     {
14         FooBar myFB = new FooBar();
15     }
16 } 

ผู้เขียนนิยามคลาส FooBar ไว้ โดยในคลาสนี้มีสมาชิกสองตัว เป็น filed หนึ่งตัว (บรรทัดที่ 3) และเป็น method หนึ่ง method (บรรทัดที่ 4 ถึง 7) method นี้คือ mc วิธีสังเกตว่า method ใดคือ mc ให้ดูที่ชื่อของ method ซึ่งจะตรงกับชื่อคลาสเสมอ

โปรแกรมบรรทัดที่ 10 ถึง 16 คือคลาส Program ซึ่งเรียกใช้ type FooBar ที่นิยามไว้ บรรทัดที่ 14 คำสั่ง

FooBar myFB = new FooBar();

เป็นรูปแบบมาตรฐานของการสร้าง object หรืออาจเขียนแยกเป็นสองบรรทัดเช่นนี้ก็ได้

FooBar myFB;

myFB = new FooBar();

บรรทัดแรก FooBar myFB; หมายถึงเราต้องการสร้างตัวแปรชื่อ myFB และกำหนด type ให้เป็น FooBar เหมือนเขียนว่า

int i;

หมายถึงเราต้องการสร้างตัวแปรชื่อ i และกำหนด type ให้เป็น int ในกรณีนี้ int คือ type ที่ถูกกำหนดไว้ใน .NET Framework class Library ส่วน FooBar คือ type ที่ถูกกำหนดไว้ในโปรแกรมของเราเอง โดยเราเป็นผู้สร้างนิยาม FooBar ไว้เอง

myFB = new FooBar();

คำสั่งนี้คือส่วนสำคัญที่เกี่ยวข้องกับ mc เพราะคำว่า FooBar() ที่เห็นในบรรทัดนี้คือ mc นั่นเอง บรรทัดบนเราสั่งว่า FooBar myFB; อย่างนี้ยังไม่มีการสร้าง object myFB เพียงถูกกำหนด type เท่านั้น และค่าของมันยังเป็น null อยู่ (คือยังไม่ได้อ้างอิงไปยัง object ใดๆ) object จะเกิดขึ้นก็ต่อเมื่อมีการเรียก mc โดยใช้คำสั่ง new และตามด้วยชื่อ method (ในตัวอย่างคือ new FooBar())

เมื่อคำสั่งนี้ทำงาน

FooBar myFB = new FooBar();

method FooBar() จะถูกเรียกให้ทำงาน และ CLR จะสร้าง object ใหม่ (หรือเรียกว่าสร้าง instance) จากคลาส FooBar (หรือที่เรียกว่าการทำ instantiate) นำ instance ที่ได้นี้ไปใส่ไว้ใน heap และกำหนดให้ตัวแปร myFB ทำหน้าที่ชี้ไปยังตำแหน่งของ object ใน heap

mc เป็นสิ่งจำเป็น เพราะหากไม่มี mc ก็จะไม่สามารถสร้าง object ได้ ดังนั้นหากท่านไม่เขียนนิยาม mc ไว้ C# จะสร้าง mc ให้โดยอัตโนมัติ (ในขณะ runtime) เรียกว่า default constructor ซึ่งเป็น mc แบบไม่มีพารามิเตอร์

ท่านสามารถสร้าง mc ได้หลายแบบโดยการทำ method overloading โปรดดูตัวอย่างโค้ดต่อไปนี้

1   using System;
2 
3   namespace ConsoleApplication1
4   {
5       class FooBar
6       {
7           string i;
8           string s;
9           public FooBar()
10          {
11              i = 1.ToString();
12          }
13          public FooBar(int x):this()
14          {
15              s = i;
16          }
17      }
18      class Program
19      {
20          static void Main(string[] args)
21          {
22              FooBar myFB = new FooBar(12);
23          }
24      }
25  }

นี่คือตัวอย่างการทำ mc overloading และทำ mc Chaining ด้วย คลาส FooBar มีนิยาม mc ไว้สองแบบๆ แรกไม่มีพารามิเตอร์ (บรรทัดที่ 9-12) แบบที่สองมีพารามิเตอร์หนึ่งตัวเป็น int (บรรทัดที่ 13-16)

ในกรณีที่มีการทำ mc overloading เป็นธรรมเนียมปฏิบัติที่จะนิยาม default mc ไว้เสมอ (คือ mc แบบไม่มีพารามิเตอร์) และให้ mc ตัวอื่นๆ เรียก default mc ให้ทำงานด้วย ในตัวอย่างโค้ดข้างบน บรรทัดที่ 13 คือนิยาม mc ที่ไม่ใช่ default mc และจะเรียก default me โดยใช้คำสั่ง :this()

ผลคือเมื่อสร้าง object จากคลา FooBar โดยการเรียก mc แบบมีพารามิเตอร์ (บรรทัดที่ 22) mc ทั้งแบบ default และแบบมีพารามิเตอร์จะถูกเรียกให้ทำงานทั้งคู่

ปรกติแล้วเราจะสร้างนิยามคลาสเพื่อนำไปใช้สร้าง object ดังนั้น mc จึงต้องมี access modifier เป็น public เพื่อให้ client class สามารถเรียกใช้งานได้ แต่มีบางครั้งที่เราไม่ต้องการให้นำคลาสไปใช้สร้าง object ในกรณีนี้จะต้องกำหนด access modifier ของ mc ให้เป็น private

 

destructor

ตรงข้ามกับ constructor คือ destructor (อ่านว่า เดสทรักเตอร์ แปลว่าผู้ทำลาย) เป็น method พิเศษที่จะทำงานก่อนที่ object จะถูกทำลายโดย Garbage Collector (GC)

ในภาษา C++ นักเขียนโค้ดจะต้องคอยระวังไม่ลืมที่จะทำลาย object ที่ไม่ได้ใช้งานเพื่อคืนหน่วยความจำให้แก่ระบบ หากลืมจะเกิดความผิดพลาดที่เรียกว่า memory leak ทำให้พื้นที่ในหน่วยความจำลดลงเรื่อยๆ ในกรณีที่เลวร้ายที่สุดอาจถึงกับทำให้ระบบหยุดทำงาน

ในภาษา C# นักเขียนโค้ดไม่ต้องกังวลเรื่องการทำลาย object และ memory leak เพราะโค้ดในภาษา C# เป็น managed code คือโค้ดที่ถูกจัดการดูแลโดย .NET Framework ซึ่งมีกลไก GC ทำหน้าที่คอยเวนคืนหน่วยความจำด้วยการทำลาย object ที่ไม่ได้ใช้งานแล้ว

อย่างไรก็ดี GC จัดการหน่วยความจำเฉพาะส่วน heap เท่านั้น ดังนั้นหากโปรแกรมของเรามีการใช้ทรัพยากรส่วนอื่นๆ นอกเหนือไปจากนั้น GC จะไม่สามารถจัดการได้ ด้วยเหตุนี้ภาษา C# จึงยังคงมี method destructor ไว้เพื่อให้เราจัดการเก็บกวาดได้ด้วยตนเอง โปรดพิจารณาโค้ดต่อไปนี้

class FooBar
{
    ~FooBar()
    {
        // ใส่โค้ดเพื่อปลดปล่อย resource ตรงนี้
    }
}

นี่คือคลาสที่มีสมาชิกเพียงตัวเดียวเป็น destructor โปรดสังเกตว่า

  • destructor คือ method ที่มีชื่อเดียวกับคลาส
  • หน้าชื่อต้องใส่เครื่องหมาย ~
  • destructor ไม่มี access modifier
  • destructor ไม่มี return type
  • destructor รับพารามิเตอร์ไม่ได้
  • ในหนึ่งคลาสมี destructor ได้ตัวเดียว
  • เราไม่สามารถทำ overload ต่อ destructor ได้

ตอนต่อไป:Method Parameter

Post a comment or leave a trackback: Trackback URL.

ความเห็น

  • Buncha  On สิงหาคม 31, 2007 at 10:39 am

    Thank you for Text 

  • Unknown  On สิงหาคม 18, 2008 at 5:30 pm

    Welcome (wow gold) and (wow power leveling) trading site, (wow gold) are cheap, (wow power leveling) credibility Very good! Quickly into the next single! Key words directly to the website click on transactions!

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

%d bloggers like this: