overloading

posted on 20 Dec 2004 18:59 by tidno1 in csharp-and-dotnet

พักเรื่องของใหม่ไว้ก่อนละกัน เอาของเก่ามาก่อน


operator overloading เป็นจุดเด่นสำคัญอย่างนึงใน C++ แต่ในภาษาที่ถือว่าเป็นภาษาลูกของมันอย่าง Java กลับไม่ได้เอาความสามารถนี้มาด้วย กลับเอามาแค่ function overloading
ข้อดีของการใช้ operator overload ก็คือสื่อความหมายดี และไม่ต้องจำชื่อฟังก์ชันให้เสียเวลา
ยกตัวอย่างเช่นในภาษา C เวลาเปรียบเทียบว่า สตริงสองตัว มีค่าเท่ากันมั้ย เราต้องใช้ฟังก์ชัน strcmp
if (strcmp(s1, s2) == 0) { // some code}
แต่ใน C# เราสามารถเปรียบเทียบมันได้ด้วยเครื่องหมาย == และ != เหมือนการเปรียบเทียบตัวแปรธรรมดา
if (s1 == s2) { // some code}

หรือ unary operator อย่าง ++ และ -- ก็สามารถทำได้
ผมยังจำตอนเรียนวิชา Data Structure 1 ที่ผมเขียน linked list ด้วย C++ และ overload operator ++ ไว้ใช้สำหรับ เลื่อน pointer ไปที่ node ถัดไป

เรามาดูกันดีกว่าว่า operator ใดที่สามารถ overload ได้บ้าง

+, -, !, ~, ++, --, true, falseoverload ได้
+, -, *, /, %, &, |, ^, <<, >>overload ได้
==, !=, <, >, <=, <=overload ได้ แต่ว่าเราต้อง overload เป็นคู่ ๆ เช่นถ้าเรา overload == เราก็ต้อง overload != ไว้ด้วย
&&, ||ถึงแม้ว่า operator สองตัวนี้จะไม่สามารถ overload ได้ แต่ว่า สองตัวนี้ จะ evaluate โดยใช้ & กับ | ดังนั้นเราก็ไป overload มันแทนได้ เพราะว่า && เป็น short-circuit ของ & เช่นเดียวกับ || ที่เป็น short-circuit ของ |
[]overload ไม่ได้เหมือนกับใน C++ แต่เราก็สามารถใช้ indexer แทนได้
()casting operator overload ไม่ได้ แต่ก็ยังมี keyword ใหม่ไว้ใช้ คือ explicit กับ implicit (ดูด้านล่าง)
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=overload ไม่ได้ แต่ operator พวกนี้ evaluate โดยใช้ operator ตัวอื่นอยู่แล้ว เช่น += ก็แค่ไป overload + ไว้แทน
=, ., ?:, ->, new, is, sizeof, typeofอดครับ พวกนี้ overload ไม่ได้

มีจุดสำคัญอย่างนึงก็คือ เราควรจะ overload operator ให้สื่อความหมายนะครับ ควรจะเป็นความหมายที่ใกล้เคียงกับ operator เดิม

explicit และ implicit casting method define ดังนี้
static explicit operator target_type { source_type identifier }
class MyType
{
public static explicit operator MyType(int i)
{
// code to convert from int to MyType
}
}
int i;
MyType x = (MyType)i;
// int-to-MyType requires cast

static implicit operator target_type { source_type identifier }
class MyType
{
public static implicit operator int(MyType m)
{
// code to convert from MyType to int
}
}

MyType x;
int i = x;
// implicitly call MyType's MyType-to-int conversion operator

Comment

Comment:

Tweet