Interface Inheritance #3: Wrapper Class

    ในยุค Visual Basic 6.0 ภาษานี้ไม่รองรับ Implementation Inheritance นั้น เพื่อเป็นการไม่ให้เสียหน้ามากนัก ทาง Microsoft จึงแนะนำให้คนจำลองการทำงานของ Implementation Inheritance โดยการใช้ Interface Inheritance ที่ Visual Basic มีผ่านเทคนิคที่เรียกว่า Wrapper Class

    เริ่มต้น สมมุติว่าคุณมี class SQLServer ตามบทที่แล้วและได้ใช้ Interface ที่ชื่อว่า IBackup ตามนี้ครับ

public interface IBackup
{
	void Backup();
	void Restore();
}
class SQLServer : IBackup
{
	void IBackup.Backup() { Console.WriteLine("IBackup.Backup"); }
	void IBackup.Restore() { Console.WriteLine("IBackup.Restore"); }
}

    อยู่มาวันหนึ่ง เราต้องการ Inherit class SQLServer มาเป็น SQLServer2000 ซึ่งถ้าเราใช้ Implementation Inheritance ก็จะสามารถทำได้ แต่ VB นั้นไม่มีครับ จึงมีการคิดค้นวิธีทำทำการ Inherit โดยใช้ Interface นั่นแหละ เขาทำอย่างนี้ครับ

public interface IBackup
{
	void Backup();
	void Restore();
}
class SQLServer : IBackup
{
	void IBackup.Backup() { Console.WriteLine("IBackup.Backup"); }
	void IBackup.Restore() { Console.WriteLine("IBackup.Restore"); }
}
class SQLServer2000 : IBackup
{
	SQLServer sql;
	public SQLServer2000()
	{
		SQLServer sql = new SQLServer();
	}
	void IBackup.Backup() { sql.Backup(); }
	void IBackup.Restore() { sql.Restore(); }
}

    นี่แหละครับ Wrapper class SQLServer2000 ทำการ inherit มาจาก SQLServer เหมือนกับทำ implementation inheritance เลยครับ วิธีการก็อย่างที่เห็น คือแอบซ่อน object ของ SQLServer ไว้ แล้วทำ Interface ให้เหมือนกับ SQLServer แล้วภายใน method เหล่านั้นก็ไปเรียกใช้ method ของ SQLServer เลย แบบนี้จะไม่เหมือนได้อย่างไร และด้วยวิธีนี้เราก็สามารถเพิ่มความสามารถ SQLServer2000 ได้โดยการเพิ่ม Method หรือ Method เดิม ได้เพิ่มความสามารถใหม่เข้าไปได้

    ดูดีใช่ใหมครับ แต่วิธีนี้ก็มีจุดด้อยตรงที่ไม่มี protected เหมือนกับใน Implementation Inheritance เพราะฉะนั้น Interface ต้องเตรียมข้อมูลภายในไว้ให้พอครับ จะได้เอา inherit ได้