16 August 2012

Virtual Method คืออะไร? (1)

Virtual method เป็นแนวคิดของ object-oriented programming ที่ไม่ค่อยเห็นกันเท่าไหร่ เพราะภาษาส่วนใหญ่ อย่างเช่น Java และ Python จะกำหนดให้ method ทุกอันเป็น virtual method ทั้งหมด คนที่เรียนใหม่ๆ จึงรับแนวคิดนี้ไปโดยไม่รู้ตัว ภาษาที่สามารถกำหนด metho d ได้ว่าเป็น virtual หรือไม่ ที่ผมพอรู้จักก็มี C++ และ C# พอดีวันก่อนผมโดนถามเกี่ยวกับเรื่องนี้ในภาษา C# ก็เลยขอเอามาเขียนเล่าไว้หน่อย เผื่อจะเป็นประโยชน์เวลาโดนถามอีก

Virtual method เกิดมาจากความคิดของ OOP ที่ต้องการขยายความสามารถของ class ที่สร้างไว้ก่อนแล้ว ด้วยวิธี inherit แล้ว override method เพื่อแก้ไขการทำงานบางส่วนของ class การใช้ virtual method ทำให้เราไม่ต้องตามไปแก้ไข method อื่นๆ ที่เรียกใช้ method ที่เราปรับปรุงทั้งหมด การระบุว่า method เป็น virtual method หมายความว่าให้เรียก method นั้นตาม object ที่สร้างขึ้นจริง ไม่ใช่เรียกตาม class ของตัวแปรที่สร้างขึ้น ลองดูตัวอย่างดีกว่า

ตัวอย่างแรกเป็น method แบบที่ไม่ใช่ virtual method

using System;

class A {
 public void print() {
  Console.WriteLine("This is A.");
 }
}

class B : A {
 public new void print() {
  Console.WriteLine("This is B.");
 }
}

class MyProgram {
 public static void Main() {
  A a1 = new A();
  a1.print();

  A a2 = new B();
  a2.print();

 }
}

โปรแกรมแรกนี้กำหนด Class A ซึ่งมี method ชื่อ print แล้วกำหนด Class B ให้เป็น subclass ของ A มี method ชื่อ print เช่นเดียวกัน (สังเกตว่าจะมี keyword ว่า new อยู่หน้า print ใน B อันนี้ C# เขาเรียกว่า method hiding คือการซ่อน method ของ superclass) เสร็จแล้วเรามี class MyProgram เอาไว้เป็น main program จะเห็นว่า ผมกำหนดตัวแปรสองตัว คือ a1 กับ a2 ตัวแปร a1 ชี้ไปที่ object ของ class A, ส่วน a2 ชื้ไปที่ object ของ class B (ปกติเราสามารถกำหนด object ของ subclass ให้กับตัวแปรของ superclass ได้อยู่แล้ว เพราะถือว่า subclass มีคุณสมบัติทุกอย่างของ superclass) เมื่อเรียกโปรแกรมนี้มาทำงาน จะได้

This is A.
This is A.

เหตุที่ผลลัพธ์เป็นอย่างนี้เพราะตัวแปร a1 และ a2 เป็นตัวแปรของ Class A เมื่อเรียก print ก็จะไปเรียก method แรกของ Class A มาทำงาน เราต้องคิดว่า object ของ Class B มีคุณสมบัติของ Class A รวมอยู่ด้วยแล้ว

ยังไม่ถึงเรื่อง virtual method เลย แต่วันนี้เอาไว้แค่นี้ก่อน วันหลังจะมาเขียนต่อ

No comments: