วันพุธที่ 17 สิงหาคม พ.ศ. 2559

Overloading Operators

ในบทนี้ คุณจะได้รู้จักและการใช้งานกับ Overloading Operators ที่เราจะใช้ในการทำการดำเนินการทางคณิตศาสตร์กับข้อมูลอื่นๆ เช่น ออบเจ็ค

Overloading Operators คืออะไร

Overloading Operators คือการเปลี่ยนแปลงวิธีการทำงานของตัวดำเนินการทางคณิตศาสตร์ให้ทำงานตามที่ ต้องการ ยกตัวอย่างเช่น ในการบวกเลขสองตัวนั้น เป็นการนำค่าของพวกมันมารวมกัน ซึ่งมันใช้ได้กับตัวเลข เช่น 2 + 3 = 5
แต่ สำหรับข้อมูลแบบอื่นเช่น ต้องการเอาน้ำสองแก้วมารวมกัน ข้อมูลที่มีอาจจะเป็นรัศมีของแก้ว หรืออื่นๆ ถ้าหากแก้วนั้นเป็นเหมือนออบเจ็ค มันจึงทำให้การทำงานเมื่อนำมารวมกันนั้น ไม่ได้เป้นเหมือนตัวเลข แต่เราใช้เครื่องหมาย + เช่นเดิม
นี่เป็นรูปแบบของการทำ Overloading Operators ในภาษา C#
class MyClass
{
    public static MyClass1 operator + (MyClass2 a, MyClass3 b)
    {
        MyClass c = b;
        return c;
    }
}
จากรูปแบบข้างบนนั้นเป็นการทำ Overloading operators สำหรับคลาส MyClass1 สำหรับเครื่องหมาย + (บวก) โดยสร้างฟังก์ชันภายในคลาสนั้นให้เป็น static และใช้คำสั่ง operator ตามด้วยเครื่องหมายที่ทำการ Overload และส่งอากิวเมนต์สองตัวสำหรับ operand ทั้งสอง

การสร้างและการใช้ Overloading Operators

ในตัวอย่างนี้ เราจะขอยกตัวอย่างสำหรับการหาผลรวมน้ำในแก้วน้ำ โดยเราจะสร้างคลาสของแก้สน้ำขึ้นมา
using System;

namespace OverloadingOperators
{
    class Program
    {
        static void Main(string[] args)
        {
            Glass g1 = new Glass(5.2f, 8);
            Glass g2 = new Glass(3.2f, 10);

            float totalvolume = g1 + g2;
            Console.WriteLine("g1 and g2 sumation of volume = " + totalvolume);

            Console.ReadKey();
        }     
    }  
}

class Glass
{
    const float PI = 3.14F;

    private float radius;
    private float height;

    public Glass (float r, float h) 
    {
        radius = r;
        height = h;
    }

    public static float operator +(Glass a, Glass b)
    {
        float totalvolume = a.GetVolume() + b.GetVolume();
        return totalvolume;
    }

    public float GetVolume()
    {
        return (2 * radius * 3.14f) * height;
    }
}
ในตัวอย่างเป็นการหาผลรวม ของออบเจ็คที่สร้างจากคลาส Glass และมีค่า return เป็น float โดยในคำสั่ง g1 + g2 นั้นเป็นการทำงานจากการ overloading และมเื่อรันโปรแกรมจะได้ผลลัพธ์ดังข้างล่าง
g1 and g2 sumation of volume = 462.208
เพื่อ ให้เข้าใจมากขึ้น การทำ overloading operators นั้นคล้ายกันกับ overloading method แต่สิ่งที่ต่างกันคือในการ return ค่าต้องเลือกสำหรับค่าใดค่าหนึ่งเท่านั้น ตัวอย่างต่อไปแทนที่เราส่งค่าผลรมของปริมาตรของแก้วทั้งสองกลับ เราจะทำการส่งแก้วใบใหม่ที่มีปริมาตรเท่าเดิมแทน
using System;

namespace OverloadingOperators
{
    class Program
    {
        static void Main(string[] args)
        {
            Glass g1 = new Glass(5.2f, 8);
            Glass g2 = new Glass(3.2f, 10);

            Glass g3 = g1 + g2;
            Console.WriteLine("g3 radius = " + g3.radius);
            Console.WriteLine("g3 height = " + g3.radius);
            Console.WriteLine("g3 volume = " + g3.GetVolume());

            Console.ReadKey();
        }     
    }  
}

class Glass
{
    const float PI = 3.14F;

    public float radius;
    public float height;

    public Glass (float r, float h) 
    {
        radius = r;
        height = h;
    }

    public static Glass operator +(Glass a, Glass b)
    {
        float totalvolume = a.GetVolume() + b.GetVolume();
        float totalArea = a.GetBaseArea() + b.GetBaseArea();

        float newRadius = totalArea / 2 / PI;
        float newHeight = totalvolume / totalArea;
        Glass c = new Glass(newRadius, newHeight);
        return c;
    }

    public float GetBaseArea()
    {
        return 2 * radius * PI;
    }

    public float GetVolume()
    {
        return (2 * radius * PI) * height;
    }
}
ในตัวอย่าง นั้นเป็นการสร้าง overloading operators สำหรับออบเจ็คจากคลาส Glass เช่นเดิม แต่ตอนนี้ค่าที่ส่งกลับจำเป็นออบเจ็คของ Glass เช่นเดิม ที่มีปริมาตรเท่าเดิม และนี่เป็นผลลัพธ์เมื่อรันโปรแกรม
g3 radius = 8.4
g3 height = 8.4
g3 volume = 462.208
จากผลของโปรแกรมั้นเราได้ทำการเปลี่ยนให้เครื่องหมาย + สำหรับออบเจ็คของ Glass นั้น return ออบเจ็คของ Glass อันใหม่ ที่มีปริมาตรเท่าเดิม และมีรัศมีและความสูงใหม่เป็นอย่างที่เห็น
และแน่นอนคุณสามารถใช้เครื่องหมายเหล่านี้ ในการทำ overloading operators ในภาษา C#
OperatorsNumber of operand
+1 or 2
-1 or 2
!1
~1
++1
--1
*2
/2
%2
==2
!=2
<2
>2
<=2
>=2
ตัวอย่างการใช้งานต่างๆ
public static SomeObjectA operator - (SomeObjectB a, SomeObjectC b)
{
    // do something
    return ...; // SomeObjectA
}

public static bool operator == (SomeObjectB a, SomeObjectC b)
{
    // do something
    return ...; // SomeObjectA
}

public static SomeObjectA operator ++ (SomeObjectB a)
{
    // do something
    return ...; // SomeObjectA
}
ในบทนี้คุณได้รู้จักและได้รู้การสร้างและการใช้งาน Overloading operators เพื่อให้การทำงานเป็นไปตามที่ต้องการได้

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Set MongoDB in the windows path environment

  Let’s set MongoDB in the windows environment in just a few steps. Step 1: First download a suitable MongoDB version according to your mach...