Interface Inheritance #5: .Net Example

    ตามธรรมเนียมครับ พอว่ากันเรื่อง OOP หนึ่งหัวข้อ มันก็ต้องมี .Net เอามาเป็นตัวอย่าง เรื่องการเขียน Program แบบ Interface ก็เช่นกัน ถ้าไม่เอาตัวอย่าง .Net มาแสดงเลย เดี๋ยวมันจะไม่สมบูรณ์

    ในบทนี้เอาตัวอย่าง เดิมครับคือการใช้ Console.WriteLine() เราเคยเรียนมาแล้วในบทที่ว่าด้วยเรื่อง Polymorphism ยังจำได้ไหมครับว่า เราเคยเรียนการ override method ToString() มาใช้ นั่นเป็นเรื่องของการทำ Polymorphism ผ่าน Implementation Inheritance วันนี้เราจะลองใช้ตัวอย่างเดียวกันนี้แหละครับ แต่เป็น Interface Inheritance

    เริ่มเรื่องตรง WriteLine() อย่างที่บอกนะครับว่ามันเก่งไม่น้อยหน้า printf() ของภาษา C เลย เราสามารถ Format รูปแบบที่เราต้องการแสดง ดังตัวอย่างนี้ครับ

Console.WriteLine("{0:000.00}   {1:000}", 123.456, 123.456);

จะได้ผลลัพธ์

123.46     123

    เราสามารถใส่ Format ได้ครับอยากให้มันเป็นรูปไหนก็กำหนดลงไปเลย เอาไว้ถ้าผมมีเวลาผมจะเขียนเรื่อง format ต่างๆ ว่ามีอะไรบ้างโดยละเอียดครับ แต่วันนี้เรามาเรียนกันเรื่องว่า object ของคุณเองก็สามารถระบุ Format ได้ ซึ่งคุณสามารถทำได้โดยอิสระ อยากให้ format อย่างไรก็ทำได้เองเลย เราใช้ Interface Inheritance ครับ ลองดู code กันก่อน

dotnet.cs

using System;
class MyClass : IFormattable
{
	string Name, Surname;
	public MyClass(string Name, string Surname)
	{
		this.Name = Name;
		this.Surname = Surname;
	}
	string  IFormattable.Format(string Format, IServiceObjectProvider sop)
	{ 	
		if (Format == "name") {
			return Name;
		}
		if (Format == "surname") {
			return Surname;
		}	
		return "Error";
	}
}
class Start
{ 	
	public static void Main() 
	{
		MyClass person = new MyClass("Supoj", "Choachaicharoenkul");
		Console.WriteLine("My name is {0:name}, My Surname is {1:surname}", 
				person, person);
	}
}

DOS Prompt

C:\CS>dotnet
My name is Supoj, My Surname is Choachaicharoenkul

C:\CS>_

   gเราเริ่มจาก Interface ที่ชื่อว่า IFormattable class ไหนต้องการให้รองรับ formatting ก็ต้อง inherit interface ตัวนี้ไป ข้างในใช้ง่ายครับ มี method เดียวคือ Format() คุณก็ Implemplent method นี้ใน class ของคุณ เมื่อเวลามันเจอ format มันจะมาเรียกที่ method นี้ ใน method นี้จะรับ Format มา แล้วเราควบคุมได้เองครับว่าเมื่อเจอ Format นี้ ควรจะส่งค่าอะไรกับไปที่ Console.WriteLine() บ้าง คงไม่งงนะครับ

    มีข้อควรระวังหน่อยครับ ถ้าเมื่อไรก็ตามที่เรา inherit interface ของ IFormattable ตัวของ ToString() จะใช้งานไม่ได้ครับ