C# Syntax #3: Example - Class Integer

integer.cs

using System;
class INTEGER
{
	private int value;
	
	public INTEGER(int value)
	{
		this.value = value;
	}
	
	public static  INTEGER Add(INTEGER x, INTEGER y)
	{
		return new INTEGER(x.value + y.value);
	}
	
	public static INTEGER Substract(INTEGER x, INTEGER y)
	{ 		
                return new INTEGER(x.value - y.value);
	}
}
class Start
{ 	public static void Main()
	{ 	
        	INTEGER a, b, c;
		a = new INTEGER(10);
		b = new INTEGER(20);
		c = INTEGER.Add(a, b);
		Console.WriteLine(c.ToInt());	
	}
}

DOS Prompt

C:\CS>integer
30

C:\CS>_

   บทนี้เป็นเรื่องสืบเนื่องจากสองบทที่แล้ว สองบทที่แล้วเราเรียนเรื่อง syntax กัน มาบทนี้มาดูตัวอย่างอย่างง่าย ซึ่งผมจะปรับปรุงตัวอย่างนี้ ในบทต่อไปๆ ตัวอย่างนี้ค่อนข้างดูไร้ประโยชน์ในแง่ของการเอาไปใช้ แต่ผมต้องการให้เรียบง่าย ทุกๆ คนอ่านแล้วรู้เลย เข้าใจง่ายเป็นเป้าหมายครับ

    ผมสร้าง class INTEGER  เป็น Class ที่เอาไว้เก็บตัวเลข Integer ใช่แล้วครับสิ่งที่มันเก็บก็คือค่า Integer ธรรมดา เกือบทุกภาษามีให้ใช้อยู่แล้วรวมทั้ง C# ผมยึดหลักเหมือนเลือกซื้อ dictionary ไม่รู้ว่าคนอื่นเลือกซื้อยังไง แต่ผมจะเลือกเปิดดูจากคำที่ง่ายๆ ผมรู้ดีอยู่แล้ว ผมจะดูว่าคำนั้นเขาอธิบายได้ดีแค่ไหน แต่เพื่อนผมบางคนเลือกเปิดจากคำที่ตัวเองไม่รู้ แบบนี้ผมว่างงใหญ่ไม่รู้ว่าที่เขาอธิบายนั้นถูกต้องครบถ้วนหรือไม่ ในทำนองเดียวกันเรื่องตัวอย่าง ผมเห็นในหนังสือสอน OOP ของฝรั่งหลายเล่มใช้ตัวอย่างในบทนี้เป็นเรื่องการสร้าง class complex หรือจำนวนเชิงซ้อน ซึ่งผมว่าเป็นวิธีที่ไม่ดี เพราะผมว่ามีไม่กี่คนที่รู้หรือจำได้ว่ามันคืออะไร ทำให้ปวดหัวสองต่อ ไหนจะเรื่อง OOP แล้วยังต้องมาเรื่องคณิตศาสตร์อีก ผมเลยเลือก class INTEGER ดูโง่หน่อย แต่ก็เช้าใจได้ง่ายครับ เรามาดูส่วนที่สำคัญกัน

ภายใน Constructor

    ผมสมมุติว่าในโลกนี้ยังไม่เคยมีตัวแปร Integer มาก่อน ผมเลยสร้าง class INTEGERr ซึ่งภายในเก็บตัวเลข integer ชื่อว่า value การ set ค่านั้นผ่านทาง constructor เท่านั้น มีข้อสังเกตใน constructor หน่อยนะครับ ผมตั้งใจให้ค่า parameter ที่ส่งเข้ามาจาก constructor ชื่อว่า value เหมือนกับตัวแปรภายใน class ถ้าเรียกใช้ value ลอยๆ มันจะหมายถึงตัวแปรที่เป็น parameter เสมอ ตัวแปรของ class จะเป็นรองอยู่เสมอทั้ง parameter และ local variable ดังนั้น C# จึงหาทางออกโดยการระบบ this. เอาไว้หน้าตัวแปรเพื่อบอกว่าตัวแปรนี้เป็นตัวแปรตัวแปรของ class ครับ

การบวกการลบ

    คราวนี้เรามาลองสร้าง function ในการบวกการลบดู คุณสามารถที่จะเขียน Code นี้ใน ส่วนของ instance ของ Class INTEGER ได้ดังนี้

public  INTEGER Add(INTEGER x)
{
	return new INTEGER(x.value + this.value);
}

แต่เมื่อเวลาคุณเรียกใช้ คุณต้องเรียกแบบนี้

INTEGER x = new INTEGER(10);
INTEGER y = new INTEGER(20);
INTEGER z;
z = x.Add(y);

   จาก Code ส่วนนี้คุณจะเห็นได้ว่ามันดูไม่ค่อยธรรมชาติที่จะเขียน Syntax ออกมาอยู่ในรูปนี้ (แต่ C++ programmers ชอบเขียนลักษณะนี้ครับ) อันนี้เป็นความคิดส่วนตัวนะครับ คนอื่นอาจคิดว่ามันเป็นธรรมชาติก็ได้ แต่ผมคิดว่า ทั้ง x และ y มันก็อยู่ในระดับเดียวกัน แต่พอเวลาเอามา Add() ทำไม่ y เป็น parameter ให้ x ดูไม่ค่อยธรรมชาดิเลย

    ผมว่าถ้าจะให้ดูเป็นธรรมชาติมันต้อง

INTEGER x = new INTEGER(10);
INTEGER y = new INTEGER(20);
INTEGER z;
z = INTEGER.Add(x, y);

    ผมว่าดูดีกว่า แต่วิธีนี้คุณต้องสร้าง Add() ให้เป็น static วิธีที่ดีกว่าจริงๆ แล้วนะจะเป็นอย่างนี้ครับ

INTEGER x = new INTEGER(10);
INTEGER y = new INTEGER(20);
INTEGER z;
z = x + y;

    แบบนี้ทำได้เหมือนกัน เราเรียกว่า operator overload ซึ่งเราจะเรียนกันในบทต่อๆ ไป ประเด็นที่ให้ดูในบทนี้คือ ไม่ว่า Add() จะเป็น function แบบ static หรือไม่ก็ตาม มันสามารถดูและแก้ค่าของ value ที่เป็น private ซ่อนอยู่ใน x และ y ได้ อันนี้เป็นประเด็นแรก

    ส่วนประเด็นที่สองนั้น จะเห็นได้ว่า ใน Add() ต้องสร้าง object ใหม่เพื่อเก็บเลข ตามตัวอย่างข้างบนคือ 30 ดังนั้นเราต้อง new() ครับ และส่งเลขตัวนั้นเป็น parameter สุดท้ายแล้วคือเราจะได้ object ใหม่ และเราก็ return ออกไป ซึ่งในตัวอย่างเราก็เอา z ไปรับ