Page cover image

Overloading of Indexers

พัชราพร ภายไธสง 650710836

Overloading of Indexers คือการที่เราสามารถสร้างหลายๆ Indexers ใน Class เดียวกันได้ ประกาศ Paramiter ได้หลายตัว และ Paramiter แต่ละตัวจะมีชนิดข้อมูลที่แตกต่างกัน Indexers จะโอเวอร์โหลดได้โดยการส่ง Paramiter 2 ประเภทที่แตกต่างกัน ซึ่งทำให้สามารถเข้าถึงข้อมูลภายใน Class ได้หลากวิธี ซึ่งจะคล้ายกับการ method overloading หรือฟังก์ชัน ที่มีการสร้างเมดธอดหรือฟังก์ชันหลายๆตัวใน Class เดียวกัน มีชื่อเดียวกัน แต่มี Paramiter ที่แตกต่างกัน

ถึงแม้จะบอกว่าคล้ายกัน แต่แน่นอนว่าต้องมีข้อแตกต่าง ซึ่งนั้นก็คือ แตกต่างตรงการใช้งาน Overloading of Indexers มีไว้เข้าถึงสมาชิกของClass ทำให้สามารถเข้าถึงสมาชิกในClassได้หลายวิธี แต่การ method overloading ไม่ได้มีไว้เพื่อเข้าถึงสมาชิกของคลาสโดยตรง ส่วนใช้จะเน้นไปที่การดำเนินการอะไรบางอย่าง อย่างการสร้างฟังก์ชัน

Indexers ในภาษาC# มีโครงสร้างข้อมูลหลายวิธีที่ใช้ในการเก็บและดึงข้อมูลบางส่วน การที่ทำให้เราเข้าถึงสมาชิกClassได้เหมือนกับการเข้าถึงarrayหรือList โดยใช้สัญลักษณ์วงเล็บสี่เหลี่ยม([])

Sysntax

public int this[int index]{
    set{//(ใช้สำหรับดึงข้อมูล)
        //code
    }
    get{//(ใช้สำหรับเก็บข้อมูล)
        //code
    }
}

Exemple 1

overload ของ indexers ด้วย int และ double

using System;
namespace Store{
    public class Dessert{
        private string[] ListDessert = new string[2];
        public string this[int index]{
            get{
                return ListDessert[index];
            }
            set{
                ListDessert[index] = value;
            }
        }
        public string this[double index]{
            get{
                return ListDessert[1]; 
            }
            set{
                ListDessert[1] = value;
            }
           
        }
        static void Main(string[] args){
            Dessert collection = new Dessert();

            collection[0] = "Cake";       
            collection[1.0] = "Donut"; 
            Console.WriteLine(collection[1.0]+" "+collection[0]); 
        }
    }
}

อธิบายตัวอย่างที่ 1

ในคลาส Dessert มีการ Overload Indexers เพื่อให้สามารถเข้าถึงข้อมูลด้วย Paramiter ที่แตกต่างกัน คือ int และ double ในClass Main มีการสร้าง collection เป็นอ็อบเจกต์ ของคลาสDessert ใช้ Indexer รับค่าจำนวนเต็ม พร้อมกำหนดชื่อ จะเข้าถึง indexer ที่รับพารามิเตอร์เป็นint แล้วsetค่าลงListDessert ใช้ Indexer รับค่าจำนวนทศนิยม พร้อมกำหนดชื่อ จะเข้าถึง indexer ที่รับพารามิเตอร์เป็นdouble แล้วsetค่าลงListDessert ต่อมาเข้าถึงข้อมูลของ Class Dessert โดยใช้ indexer ทั้งสองประเภทคือ intและ double แล้ว get ข้อมูลออกมาConsole.WriteLine(collection[1.0]+" "+collection[0]);


Exemple 2

overload ของ indexers ด้วย int และ String

using System;
namespace Store{
    public class Dessert{
        private string[] ListDessert = { "Cake", "Donut", "Cookie" };

        public string this[int index]{
            get { 
                return ListDessert[index];
            }
            set { 
                ListDessert[index] = value; 
            }
        }
        public string this[string name]{
            get{
                for (int i = 0; i < ListDessert.Length; i++){
                    if (ListDessert[i] == name)
                        return "Yes";
                }
                return "No";
            }
        }
        static void Main(string[] args){
            Dessert collection = new Dessert();
            Console.WriteLine(collection[0]);
            collection[0] = "Brownie";
            Console.WriteLine(collection[0]); 
            Console.WriteLine(collection["Donut"]); 
            Console.WriteLine(collection["Ice Cream"]);
        }
    }
}

อธิบายตัวอย่างที่2

ในคลาส Dessert มีการ Overload Indexers เพื่อให้สามารถเข้าถึงข้อมูลด้วย Paramiter ที่แตกต่างกัน คือ int และ String หลักการทำงานเหมือนกับตัวอย่างที่1 ต่างแค่การเข้าถึงข้อมูลจะใช้ Indexer รับค่าจำนวนเต็มหรือชื่อ และในCodeตัวอย่างนี้ ไม่มีการใช้ set ในIndexer ที่รับParameter เป็นString มีแค่การใช้ get อย่างเดียว โดยการนำ Parameter ที่ถูกส่งมาจาก Main วนลูปดูว่ามีข้อมูลอยู่ใน array ListDessert ไหม แล้ว return ออกมาว่ามีหรือไม่มี


เปรียบเทียบOverloading of Indexers กับ Java, C, Python

1.ภาษา Java

ใน java ไม่มีคำสั่ง Overloading of Indexers เหมือนในภาษา C# ที่สามารถเข้าถึงและแก้ไขค่าของสมาชิกใน class ได้โดยตรง แต่มีการสร้าง Method getter และ Method setter ที่สามารถนำมาใช้แทนกันได้เพื่อให้มีหน้าที่การทำงานคล้ายกับ indexer

public class Dessert {
    private String[] strDessert = new String[2];

    public String getDessert(int index) {
        return strDessert[index];
    }

    public void setDessert(int index, String value) {
        strDessert[index] = value;
    }

    public String getDessert(String index) {
        return "enjoy";
    }

    public static void main(String[] args) {
        Dessert can = new Dessert();
        can.setDessert(0, "Donut");
        System.out.println(can.getDessert(0) + " " 
                            + can.getDessert("candy"));
    }
}

2.ภาษา Python

ใน Python ก็จะมีแนวคิดคล้ายกับJava สร้าง property และ dunder methods แทน เพื่อเข้าถึงและแก้ไขค่าของสมาชิก ภายใน class

class Dessert:
    def __init__(self):
        self.str_dessert = [None, None] 

    def get_dessert(self, index):
        return self.str_dessert[index]

    def set_dessert(self, index, value):
        self.str_dessert[index] = value

    def get_dessert_by_name(self, index):
        return "enjoy"

if __name__ == "__main__":
    can = Dessert()
    can.set_dessert(0, "Donut")
    print(f"{can.get_dessert(0)} {can.get_dessert_by_name('candy')}")

3.ภาษา C

ใน C เช่นกัน ไม่มีคำสั่ง Overloading of Indexers แต่สามารถสร้างฟังก์ชันและการใช้pointerแทนได้ เพื่อให้สามารถเข้าถึงข้อมูลในอาร์เรย์ได้เหมือนการใช้งาน indexer

#include <stdio.h>
#include <string.h>

char* getDessert(char desserts[][20], int index){
    if (index >= 0 && index < 2) {
        return desserts[index];
    }
}
void setDessert(char desserts[][20], int index, char *value){
    if (index >= 0 && index < 2) {
        strcpy(desserts[index], value); 
    }
}

char* getDessertByName(char *index){
    return "enjoy";
}

int main(){
    char desserts[2][20]; 
    setDessert(desserts, 0, "Donut");
    setDessert(desserts, 1, "Cake");
    printf("%s %s\n", getDessert(desserts, 0), 
                        getDessertByName("candy"));
}

อธิบายเพิ่มเติม

มีการสร้างฟังก์ชัน getDessert รับ array ของ desserts และ index แล้วคืนค่าชื่อ ที่ตำแหน่งindex และ setDessert รับ array ของ desserts และ index แล้วบันทึกชื่อ ที่ตำแหน่งindex

Out put

Donut enjoy

Slide


Reference

  • ใช้ศึกษาการทำงานของ Overloading of Indexers

  • ใช้ศึกษา Indexers

  • ใช้ศึกษาเรื่องPointers ในภาษา C เพื่อนำมาใช้แทน Overloading of Indexers ในภาษา C#

  • ใช้เพื่อศึกษา Method เพื่อหาความแตกต่างกับ Indexers

  • ใช้ศึกษา getter และsetter ในภาษา java

  • ศึกษาเรื่อง properpy และdunder methods ในpython

  • ใช้ศึกษาการสร้างฟังก์ชันในภาษา C

Last updated