Interfaces

11 February 2016

ในการเขียนโปรแกรมเชิงวัตถุ Interfaces เป็นคำที่ใช้กับการกำหนดประเภทของข้อมูลแบบ abstract โดยการกำหนดเมธอดที่ไม่มีโค้ดการทำงาน ในบทนี้ เราจะแนะนำให้คุณรู้จักกับ Interface ในภาษา C# และวิธีใช้งานร่วมกับ Inheritance ของคลาส ซึ่งถือว่าเป็นคุณสมบัติหนึ่งของการเขียนโปรแกรมเชิงวัตถุ

Interfaces คืออะไร

Interfaces นั้นใช้กำหนดประเภทของข้อมูลแบบ abstract ที่ไม่มีโค้ดการทำงานอยู่ภายใน แต่มีการกำหนดเพียงแค่ method signature การใช้งานของ Interfaces นั้นจะนำไป Implement โดยคลาส สำหรับการกำหนดการทำงานให้กับเมธอด นอกจากนี้ คลาสยังสามารถที่จะ Implement ได้หลาย Interfaces ในเวลาเดียวกัน ดังนั้น Interfaces จึงเป็นการกำหนดประเภทข้อมูลอย่างหนึ่ง ที่ใช้ในการกำหนดว่าคลาสจะต้องมีเมธอดอะไรบ้าง

รูปแบบของการสร้าง Interface ในภาษา C# เป็นดังนี้

interface InterfaceName
{
    void method1();
    // ...
}

ในการประกาศ interface นั้นคุณจะต้องใช้คำสั่ง interface และสมาชิกของมันเช่น method นั้นไม่ต้องมีส่วนของการทำงานอะไร เพราะว่ามันจะถูกนำไป implement โดยคลาสนั้นเอง ในการ implement interfaces นั้นจะใช้เครื่องหมาย : ซึ่งเป็นเรื่องหมายเดียวกับการ Inheritance ถ้ามีการ Inherit อยู่ก่อนแล้วจะใช้เครื่องหมาย , แทน

คุณสามารถทำการ implement ได้หลาย interfaces โดยการใช้เครอื่งหมาย comma เช่นกัน ต่อไปมาดูตัวอย่างการใช้าน Interface

using System;

interface IVerhicle
{
    void Move();
    void StartEngine();
}

class Cars : IVerhicle
{
    public void Move()
    {
        Console.WriteLine("Driving on the ground.");
    }

    public void StartEngine()
    {
        Console.WriteLine("Car engine started.");
    }
}

class Boat : IVerhicle
{
    public void Move()
    {
        Console.WriteLine("Sailing on the water.");
    }

    public void StartEngine()
    {
        Console.WriteLine("Boat engine started.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Cars car = new Cars();
        car.StartEngine();
        car.Move();

        Boat boat = new Boat();
        boat.StartEngine();
        boat.Move();
    }
}

ในตัวอย่าง เราได้สร้าง Interfaces ที่ชื่อว่า IVerchicle ซึ่งใน Interfaces นี้มีการกำหนดเมธอด signature สองเมธอดคือเมธอด Move() เป็นเมธอดสำหรับการเคลื่อนที่ของยานพาหนะ และเมธอด StartEngine() เป็นเมธอดในการสตาร์ทเครื่องยนต์ของยานพาหนะ เมธอดเหล่านี้ไม่มีการกำหนดการทำงาน หรือกล่าวอีกนัยหนึ่งมันเป็นเมธอดแบบนามธรรม

class Cars : IVerhicle
{
    public void Move()
    {
        Console.WriteLine("Driving on the ground.");
    }

    public void StartEngine()
    {
        Console.WriteLine("Car engine started.");
    }
}

class Boat : IVerhicle
{
    public void Move()
    {
        Console.WriteLine("Sailing on the water.");
    }

    public void StartEngine()
    {
        Console.WriteLine("Boat engine started.");
    }
}

ต่อมาเราสร้างคลาสของยานพาหนะคือคลาส Car และคลาส Boat และทำการ Implement interfaces IVerhicle โดยการกำหนดการทำงานให้กับและเมธอดที่แตกต่างกันไป ขึ้นกับการทำงานของคลาสนั้น นี่เป็นแนวคิดของการใช้งาน Interfaces โดยการที่คลาสทั้งสองใช้ Interfaces ร่วมกันและมีเมธอดทีเหมือนกัน แต่การทำงานของเมธอดเหล่านั้นแตกต่างกัน

Car engine started.
Driving on the ground.
Boat engine started.
Sailing on the water.

นี่เป็นผลลัพธ์การทำงานของโปรแกรม ผลลัพธ์ของการเรียกใช้เมธอดในทั้งสองคลาสนั้นแตกต่างกัน เพราะเกิดจากการ Implement interfaces ภายในคลาสเหล่านั้นให้ทำงานตามวิธีของมัน เช่น การสตาร์ทของรถยนต์นั้นแตกต่างจากเรือ เป็นต้น

นอกจากนี้ Interfaces ยังสามารถใช้ในการสร้างตัวแปรได้ ซึ่งทำให้มันเป็นคุณสมบัติของ Polymorphism ในภาษา C# ด้วยนั้นเอง เช่นการเปลี่ยนในเมธอด Main เป็น

Verchicle car = new Cars();
car.StartEngine();
car.Move();

Verchicle boat = new Boat();
boat.StartEngine();
boat.Move();

แต่อย่างไรก็ตามก็ยังต้อง instance จาก class ที่ implement มันเสมอ new Cars() หรือ new Boat() ซึ่งทั้งสองแบบนั้นจะได้ผลัพธ์เหมือนกันดังข้างล่าง

Driving on the ground
Sailing on the water

Implement multiple interfaces

ในการเขียนโปรแกรมเชิงวัตถุ ในการสร้างคลาสนั้น มันสามารถที่จะ Implement มากกว่าหนึ่ง Interfaces ในครั้งเดียวได้ เราสามารถกล่าวได้ว่าคลาสที่มีการ Implement หลาย Interfaces นั้นเป็นคลาสหลายประเภทในคลาสเดี่ยวกัน มาดูตัวอย่างการ Implement หลาย Interfaces ในภาษา C#

using System;

interface iShape2D
{
    void Draw();
    void Draw3D();
}

interface iShape3D
{
    double GetArea();
    double GetSurfaceArea();
}

class Circle : iShape2D, iShape3D
{

    public double radius;
    const double PI = 3.14;

    public void Draw()
    {
        Console.WriteLine("Draw circle.");
    }

    public double GetArea()
    {
        return PI * Math.Pow(radius, 2);
    }

    public void Draw3D()
    {
        Console.WriteLine("Draw sphere.");
    }

    // formular: 4 * PI * (r ^ 2)
    public double GetSurfaceArea()
    {
        return 4 * GetArea();
    }

}

class Square : iShape2D, iShape3D
{

    public double length;

    public void Draw()
    {
        Console.WriteLine("Draw square.");
    }

    public double GetArea()
    {
        return Math.Pow(length, 2);
    }

    public void Draw3D()
    {
        Console.WriteLine("Draw cube.");
    }

    // 6 sides surface area
    public double GetSurfaceArea()
    {
        return 6* GetArea();
    }

}

class Program
{
    static void Main(string[] args)
    {
        Circle cir = new Circle();
        cir.radius = 5;
        cir.Draw();
        Console.WriteLine("with area " + 
            cir.GetArea() + " square inches");
        cir.Draw3D();
        Console.WriteLine("with surface area " + 
            cir.GetSurfaceArea() + " square inches");

        Square box = new Square();
        box.length = 4;
        box.Draw();
        Console.WriteLine("with area " + 
            box.GetArea() + " square inches");
        box.Draw3D();
        Console.WriteLine("with surface area " + 
            box.GetSurfaceArea() + " square inches");

    }
}

ในตัวอย่าง เป็นโปรแกรมในการวาดรูปทรงในสองมิติและสามมิติและการคำนวณหาพื้นที่ผิวของวัตถุ เราได้สร้างสอง Interfaces คือ iShape2D เป็น Interfaces ที่กำหนดเมธอดเกี่ยวกับการทำงานในสองมิติ และ iShape3D เป็น Interfaces ที่กำหนดเมธอดเกี่ยวกับการทำงานในสามมิติ

class Circle : iShape2D, iShape3D
{
...

class Square : iShape2D, iShape3D
{

ต่อมาเราสร้างคลาส Circle และคลาส Square ซึ่งเป็นคลาสของวงกลมและสี่เหลี่ยมด้านเท่า โดยแต่ละคลาสได้มีการ Implement หลาย Interfaces โดยการคั่นด้วยเครื่องหมาย , หลังจากนั้นแต่ละคลาสได้กำหนดการทำงานให้แต่เมธอดของมันเอง

Draw circle.
with area 78.5 square inches
Draw sphere.
with surface area 314 square inches
Draw square.
with area 16 square inches
Draw cube.
with surface area 96 square inches

นี่เป็นผลลัพธ์การทำงานของโปรแกรมในการ Implement หลาย Interfaces ในภาษา C#

ในบทนี้คุณได้เรียนรู้เกี่ยวกับ Interfaces ในภาษา C# และการใช้งานของมัน ซึ่งจะมีประโยชน์ในการประกาศบอกวาจะมีการทำงานนี้ไว้ล่วงหน้า แต่การทำงานของแต่ละคลาสนั่นจะไม่เหมือนกันซึ่งต้องนำไป implement โดยคลาส

บทความนี้เป็นประโยชน์หรือไม่? Yes · No