ตอน 5 : Inheritance


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

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

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

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

 

 

Inheritance

 

วิธีง่ายที่สุดเพื่อดูว่าภาษาใดเป็นภาษาที่สนับสนุน OOP หรือไม่ ให้ตรวจสอบว่าภาษานั้นสนับสนุน Inheritance หรือไม่ ถ้าไม่ แสดงว่าภาษานั้นไม่เป็น OOP

Inheritance (อ่านว่าอินเฮียริแตนซ์ แปลว่า “สืบสันดาน” หรือ “การสืบทอดมรดก”) เป็นหลักการสำคัญหนึ่งในสามหลักการของ OOP หลักการนี้ มีไว้เพื่อให้สามารถต่อยอดงานใหม่ จากงานเดิมที่เคยทำไว้แล้ว โดยไม่ต้องเริ่มจากศูนย์

ใน .NET Framework ทุกสิ่งทุกอย่างล้วนสืบสันดานจาก base class ชื่อ Object หรือกล่าวได้อีกอย่างหนึ่งว่าคลาสชื่อ Object เป็นต้นตระกูลของการการสืบวงศ์วานตามลำดับชั้น (เรียกว่า hierarchy อ่านว่า ไฮราคี แปลว่าลำดับชั้น) ยกตัวอย่างเช่นคลาส TextBox ซึ่งทำหน้าที่สร้าง object ที่เป็น WebControl แบบกล่องข้อความ มีลำดับการสืบสันดานดังนี้

 

System.Object

System.Web.UI.Control

System.Web.UI.WebControls.WebControl

System.Web.UI.WebControls.TextBox

 

จะเห็นว่า TextBox สืบสันดานจาก WebControl ซึ่งสืบสันดานจาก Control ซึ่งสืบสันดานจาก Object ดังนั้น TextBox จึงมี hierarchy เป็นอันดับสี่ในสายการสืบสันดานเมื่อนับจากต้นตระกูลหรือ root base class (ทั้งหมดอยู่ใน namespace System ดูรายละเอียดในบทที่ 2)

ภาพ 114: ระบบไฟล์ในฮาร์ดดิสก์เป็นตัวอย่างโครงสร้าง hierarchy

 

ยกตัวอย่างเช่น ท่านเขียนคลาสชื่อ ListProduct (หรือจะใช้ชื่ออะไรก็ตาม) เพื่อใช้สร้าง object ซึ่งทำหน้าที่แสดงข้อมูลรายละเอียดสินค้าหนึ่งชิ้น ไว้เมื่อสองเดือนก่อน พอถึงวันนี้ท่านต้องการ object ซึ่งทำหน้าที่แสดงข้อมูลรายละเอียดสินค้าสิบชิ้น แทนที่ท่านจะเขียนคลาสใหม่หมด หรือนำคลาส ListProduct มาแก้ไขใหม่ให้แสดงสินค้าสิบชิ้น (ซึ่งอาจทำไม่ได้ เพราะมีโปรแกรมส่วนอื่นใช้งานคลาสนี้อยู่) ท่านสามารถเขียนคลาสใหม่ชื่อ ListProductPage (หรือจะใช้ชื่ออะไรก็ตาม) แล้วดึงคุณสมบัติทั้งหมดของคลาส ListProduct มาไว้ในคลาสใหม่ และเพิ่มเติมคุณสมบัติใหม่เพื่อแสดงสินค้าเพิ่มอีกเก้าชิ้น

ในตัวอย่างย่อหน้าบนคลาส ListProduct ทำหน้าที่เป็น base class หรือ super class ส่วนคลาส ListProductPage ทำหน้าที่เป็น sub class หรือ derived class (child class ก็ว่า)

เพื่อให้ท่านเข้าใจหลักการ Inheritance มากขึ้น ผู้เขียนจะแสดงการเขียนโค้ดอย่างง่าย และสั้นที่สุด เพื่อสาทิตการหลักการ Inheritance โปรดพิจารณาคลาสต่อไปนี้

 

class Foo
{
     public void WriteFoo()
     {
          Console.WriteLine("Foo");
     }
}

 

นี่คือคลาสสั้นๆ ชื่อ Foo (ชื่อนี้ไม่มีความหมายพิเศษใดๆ) ภายในคลาสมีสมาชิกเพียงตัวเดียว คือ method ชื่อ WriteFoo() method นี้ทำหน้าที่พิมพ์คำว่า Foo บน ต่อไปผู้เขียนจะสร้างนิยามอีกคลาสหนึ่งที่สืบสันดานจากคลาสนี้

 

class Bar : Foo
{
     public void WriteBar()
     {
           Console.WriteLine("Bar ");
      }
}

 

โปรดสังเกตบรรทัดแรก class Bar : Foo ทำหน้าที่ประกาศชื่อคลาส (ชื่อ Bar) เครื่องหมายจุดคู่ (colon🙂 ทำหน้าที่บอกให้รู้ว่าคลาสนี้สืบสันดานจากคลาสอื่น Foo คือชื่อของ base class

ภายในคลาส Bar มีสมาชิกเพียงตัวเดียว คือ method ชื่อ WriteBar ทำหน้าที่พิมพ์คำว่า Bar บนจอภาพ แม้ผู้เขียนจะนิยามสมาชิกไว้ในคลาส Bar เพียง method เดียว object ที่ถูกสร้างจากคลาส Bar จะมี method สอง method คือ WriteBar() และ method WriteFoo() ซึ่งเป็นมรดกจากคลาส Foo

โปรแกรมสำหรับทดสอบการทำงานของสองคลาสนี้เป็นดังนี้

 

1 static void Main(string[] args)
2 {
3      Foo myFoo = new Foo();
4      myFoo.WriteFoo();
5
6      Bar myBar = new Bar();
7      myBar.WriteBar();
8      Console.ReadLine();
9 }

 

โค้ดบรรทัดที่ 3 สร้าง object ชื่อ myFoo จากคลาส Foo บรรทัดที่ 4 เรียก method WriteFoo() ให้ทำงาน บรรทัดที่ 6 สร้าง object อีกตัวชื่อ myBar แล้วเรียกใช้ method WriteBar() ในบรรทัดที่ 7 ส่วนบรรทัดที่ 8 ทำหน้าที่หยุดรอการกดปุ่ม ถ้าไม่ใส่คำสั่งบรรทัดนี้ จะทำให้โปรแกรมจบการทำงานโดยเรามองผลลัพธ์ไม่ทัน

ผลลัพธ์จากการวิ่งโปรแกรมเป็นดังนี้

 

Foo

Bar

 

ในขณะที่ภาษา C++ สนับสนุนให้ sub class สืบสันดานจากหลายๆ base class ได้ (เรียกว่า multiple inheritance) แต่ภาษา C# กลับทำเช่นนั้นไม่ได้ เพราะภาษา C# และภาษา Java สนับสนุนให้ sub class สืบสันดานจาก base class ได้เพียงคลาสเดียวเท่านั้น (เรียกว่า single inheritance) บางคนเข้าใจผิดว่านั่นคือจุดด้อยของภาษา C# และ Java อันที่จริงแล้วผู้สร้างภาษาทั้งสองเจตนาที่จะตัด multiple inheritance ออกไปเพราะต้องการให้ภาษาของตนไม่ยุ่งยากซับซ้อน และได้ประดิษฐ์กลไกชื่อ interface (อินเตอร์เฟส อย่าสับสนกับ user interface หรือ hardware interface เพราะคนละเรื่องกัน) ขึ้นมาทดแทน ปัญหาใดก็ตามที่ต้องแก้ด้วย multiple inheritance จะสามารถใช้การทำ interface ทดแทนได้

ภาพ 115: James Gosling ผู้สร้างภาษา Java

 

ในหนังสือเล่มนี้ท่านจะได้เรียนทฤษฏี inheritance เพิ่มเติมในบทที่ 5 และเรียนภาคปฏิบัติโดยละเอียดในบทที่ 7

 

ตอนต่อไป : Polymorphism

Post a comment or leave a trackback: Trackback URL.

ความเห็น

  • Pla  On กุมภาพันธ์ 14, 2007 at 10:05 am

    เราอยากได้โค้ดที่ยาวกว่านี้นะค่ะ  จะขอบคุณมากๆเลย

  • ลาภลอย  On กุมภาพันธ์ 15, 2007 at 6:49 pm

    ตัวอย่างโค้ดใช้งานจริงยาวๆ จะอยู่ในภาคปฏิบ้ติของหนังสือ ซึ่งจะเริ่มจากบทที่ 7 ถึงบทที่ 21
    ที่คุณกำลังอ่านอยู่นี้คือบทที่ 1 ครับ

  • phasook  On พฤษภาคม 7, 2007 at 2:59 pm

    อ่านจบอีกอันล่ะบทนี้แปลก ๆ นะครับ ช่วง Code ตัวอย่างเพราะเห็นบอกว่าสืบทอดกันได้ แต่ในตัวอย่างกลับเรียกใช้ทีละอันซึ่งน่าจะเป็นอย่างนี้มากกว่า    class Program    {        static void Main(string[] args)        {            Bar myBar = new Bar();            myBar.WriteFoo();            myBar.WriteBar();        }    }    class Foo    {        public void WriteFoo()        {            Console.WriteLine("Foo");        }    }    class Bar : Foo    {        public void WriteBar()        {            Console.WriteLine("Bar");        }    }

  • Polly  On ตุลาคม 7, 2007 at 3:25 am

    ขอบคุณนะค่ะ

  • SuS  On ตุลาคม 22, 2008 at 11:01 am

    ก็เพ่งแล้วเพ่งอีก foo  ๆ bar  ๆ งงกับการสืบทอดมองไม่เห็นร่องรอยการสืบทอดกันเลย นอกจากการประกาศว่าสืบทอดน่ะคราบ 

ใส่ความเห็น

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: