Partial Methods

พิชญา พิมพ์มหาศิริ 650710572

Partial Methods เป็นเมธอดพิเศษที่มีเฉพาะในภาษา C# ปกติแล้วเมธอดนี้จะอยู่ใน หรือใน struct ซึ่งช่วยให้สามารถประกาศเมธอดแต่ยังไม่ต้องกำหนดการทำงานของเมธอดนั้น

โดยส่วนการประกาศอยู่ใน partial class หนึ่ง และส่วนการนิยามอยู่ในอีก partial class หนึ่ง หรือใน partial class เดียวกันอาจมีทั้งส่วนประกาศและส่วนการนิยามเลยก็ได้ หากไม่มีการกำหนดการทำงานในส่วนใดเลยจะถูกละทิ้ง โดยคอมไพเลอร์จะไม่สร้างเมธอดนั้นใน หรือ และไม่ส่งผลกระทบต่อโปรแกรม

Syntax

การประกาศ partial method ประกาศโดยใช้คีย์เวิร์ด partial นำหน้าเสมอ

partial void MethodName
{
    // Code
}

กฎและข้อจำกัดในการ Implement Partial method

  • signature ของ partial method ต้องเหมือนกับ partial classes

  • ไม่สามารถระบุ access modifiers นำหน้าได้ เช่น public, private, protected

  • ไม่สามารถระบุ modifiers อื่น ๆ เช่น virtual, override, sealed, new, extern

  • เป็นเมธอดแบบ private โดยปริยาย

  • คืนค่าเป็น void เท่านั้น

  • อาจมีพารามิเตอร์แบบ pass by ref.

  • ไม่สามารถมีพารามิเตอร์แบบ out

  • สามารถเป็นเมธอดแบบ static

  • สามารถเป็นเมธอดแบบ

ตัวอย่างโค้ดในการ Implement Partial method

Square1.cs
public partial class Square
{
    // Partial Method Declaration
    partial void area(int s);
    public void print()
    {
        Console.WriteLine("Example of Partial Method");
    }
}

ไฟล์ Square1.cs เป็นคลาสสำหรับแค่ประกาศเมธอดไว้เปล่า ๆ โดยในที่นี้ประกาศ partial method ที่ชื่อว่า area()

Square2.cs
public partial class Square
{
    public void new_area(int s)
    {
        area(int s);
    }
    // Partial Method Implementation
    partial void area(int a)
    {
        int val = a * a;
        Console.WriteLine("Area of the square is : {0}", val);
    }
}

ไฟล์ Square2.cs เป็นคลาสสำหรับกำหนดการทำงานภายใน partial method ที่ชื่อว่า area()

เมื่อรันโค้ดข้างต้น คอมไพเลอร์จะรวม Square1.cs และ Square2.cs เข้าด้วยกันเป็นไฟล์เดียว ซึ่งก็คือคลาส Square ดังโค้ดด้านล่าง

Square
public class Square
{
    public void print()
    {
        Console.WriteLine("Example of Partial Method");
    }
    public void new_area(int s)
    {
        area(int s);
    }
    private void area(int a)
    {
        int val = a * a;
        Console.WriteLine("Area of the square is : {0}", val);
    }
}

เปรียบเทียบกับภาษา C, Java และ Python

C# มี Partial method เพื่อให้สามารถแยกและรวมการทำงานของเมธอดในหลายไฟล์ได้

C ไม่มี Partial method แต่สามารถรวมไฟล์หรือแยกการประกาศไว้ใน header files(.h) และการนิยามไว้ใน source files(.c)

โดย header files แบ่งออกเป็น 1) pre-existing เช่น #include <stdio.h> และ 2) user-defined ที่โปรแกรมเมอร์สามารถสร้างเองได้ตามการทำงานที่ต้องการ เช่น #include “Someheader.h”

int returnSeven(void);

ตัวอย่างโค้ดข้างต้นเป็นการแยกไฟล์ header.h ซึ่งเป็นแบบ user-defined (#include "header.h") กับ source.c แล้วรวมกันระหว่างคอมไพล์และลิงก์โปรแกรม เพื่อให้สามารถไปเรียกใช้งานได้ในฟังก์ชั่น main()

คุณสมบัติ
Partial method (C#)
Header files + Source files (C)

การแยกโค้ด

แยกการประกาศและการนิยามเมธอดในหลายไฟล์ผ่าน partial class

แยกการประกาศฟังก์ชันใน header files(.h) และการนิยามใน source files(.c)

การประกาศเมธอด

นำหน้าด้วยคีย์เวิร์ด partial ประกาศภายใน partial class/struct

ประกาศฟังก์ชันใน header files(.h)

การนิยามเมธอด

นิยามเมธอดใน partial class อื่นในไฟล์แยกกัน

นิยามฟังก์ชันใน source files(.c)

บังคับการนิยาม

ไม่บังคับ ถ้าไม่มีการนิยาม คอมไพเลอร์จะไม่สร้างเมธอด

บังคับ ถ้าไม่มีการนิยามจะเกิด linker error

ความสัมพันธ์ระหว่างไฟล์

ต้องใช้ร่วมกับ partial class หรือ struct เท่านั้น

header files(.h) ถูก include ใน source files(.c) เพื่อให้สามารถใช้ฟังก์ชันที่ประกาศใน source file ได้

Java ไม่มี partial method แต่สามารถใช้ abstract class และ interfaces ที่มีแนวคิดและลักษณะการทำงานที่ใกล้เคียงกันได้ ซึ่งจะเป็นการประกาศเมธอดเปล่า ๆ ไว้ก่อนโดยที่ยังไม่มีการนิยามภายใน

เมธอดใน interface ที่ไม่ได้ถูกประกาศเป็น default หรือ static จะถือว่าเป็น abstract โดยปริยาย

abstract class GraphicObject {
    int x, y;
    // Code
    void moveTo(int newX, int newY) {
        // Code
    }
    abstract void draw();
    abstract void resize();
}

class Circle extends GraphicObject {
    void draw() {
        // Code
    }
    void resize() {
        // Code
    }
}

จากโค้ดตัวอย่างข้างต้น abstract class ที่ชื่อ GraphicObject มีการประกาศ abstract method ที่ชื่อ draw() และ resize() ไว้เปล่า ๆ และคลาส Circle ซึ่งเป็นคลาสลูกต้องกำหนดการทำงานเมธอด draw() และ resize() ด้วย

คุณสมบัติ
Partial method (C#)
Abstract class (Java)
Interfaces (Java)

การประกาศเมธอด

นำหน้าด้วยคีย์เวิร์ด partial ประกาศภายใน partial class/struct

นำหน้าด้วยคีย์เวิร์ด abstract ประกาศภายใน abstract class

ใช้ใน interface โดยไม่มีการนิยาม

การนิยามเมธอด

นิยามใน partial class ใดก็ได้ หรือนิยามภายหลัง

ต้องนิยามในคลาสลูกที่สืบทอด abstract class นั้น

ต้องนิยามในคลาสที่ implement interface นั้น

บังคับการนิยาม

ไม่บังคับ ถ้าไม่มีการนิยาม คอมไพเลอร์จะไม่สร้างเมธอด

เมธอดที่เป็น abstract ต้องถูกนิยามในคลาสลูก

เมธอดที่ประกาศใน interface ต้องถูกนิยามในคลาสลูก

การใช้งานหลายที่

ใช้กับ partial class/struct หลายไฟล์

ใช้การสืบทอดหลายคลาสไม่ได้

คลาสสามารถ implement interface ได้หลายตัว

Python ไม่มี Partial method แต่สามารถแยกเมธอดและคลาสในหลายไฟล์ได้ แล้วนำมารวมผ่านการ import โดยฟังก์ชันที่ถูกประกาศและนิยามจะต้องอยู่ในที่เดียวกัน และไม่มีการละทิ้งฟังก์ชันที่ไม่ได้กำหนดการทำงาน หากไม่มีการกำหนดจะเกิด runtime error

คำสั่ง import รวมการทำงานสองอย่างเข้าด้วยกัน คือ ค้นหาโมดูลที่ตั้งชื่อไว้ จากนั้นจะ binding ผลลัพธ์จากการค้นหาเข้ากับชื่อ

def say_hello():
   print( 'Hello, world!' )

จากโค้ดตัวอย่างข้างต้น แยกฟังก์ชัน say_hello() ไว้ในไฟล์หนึ่งที่ชื่อ file1.py จากนั้น import ฟังก์ชันจากไฟล์นั้นเข้าอีกไฟล์หนึ่งที่ชื่อ main.py พร้อมเรียกใช้ฟังก์ชันที่ถูก import มา

คุณสมบัติ
Partial method (C#)
Import (Python)

การทำงานหลัก

ประกาศและนิยามเมธอดแยกในหลายไฟล์

ค้นหาไฟล์และนำฟังก์ชันเข้ามาใช้งานในไฟล์ปัจจุบัน

การแยกโค้ด

แยกการประกาศและนิยามในหลายไฟล์ผ่าน partial class

แยกโค้ดเป็นโมดูลหรือไฟล์ต่าง ๆ แล้วรวมกันผ่านการ import

บังคับการนิยาม

ไม่บังคับ ถ้าไม่มีนิยาม คอมไพเลอร์จะไม่สร้างเมธอด

ต้องมีการนิยามฟังก์ชันหรือคลาสในไฟล์ที่ import

การเรียกใช้งาน

เรียกใช้ภายในคลาสที่ประกาศไว้

เรียกใช้ด้วยคีย์เวิร์ด import ตามด้วยโมดูลหรือไฟล์ และใช้ฟังก์ชันที่ import มา

ผลลัพธ์การรวมไฟล์

เมธอดที่นิยามจะนำมารวมกับคลาสหรือ struct ในตอนคอมไพล์

ฟังก์ชันและคลาสในไฟล์จะพร้อมใช้งานในไฟล์ที่ import

สไลด์นำเสนอ

คลิปนำเสนอ

อ้างอิง

ส่วนเนื้อหาหลัก Partial Methods

Ankita Saini. (2019, January 23). Partial Methods in C#. GeeksforGeeks. https://www.geeksforgeeks.org/partial-methods-in-c-sharp/ BillWagner. (2024, November 1). Partial member (C# Reference). Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/partial-member Shivam Verma. (2024, March 27). Partial Method in C#. Naukri Code 360. https://www.naukri.com/code360/library/partial-method-in-c-sharp

ส่วนเนื้อหาเพิ่มเติมเกี่ยวกับ Partial Classes

Ankita Saini. (2020, November 17). Partial Classes in C#. GeeksforGeeks. https://www.geeksforgeeks.org/partial-classes-in-c-sharp/?ref=oin_asr1 BillWagner. (2024, November 1). Partial Classes and Methods (C# Programming Guide). Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/partial-member

ส่วนการเปรียบเทียบกับภาษา C

C Function Declaration and Definition. (n.d.). W3Schools. https://www.w3schools.com/c/c_functions_decl.php Meghaabishtt. (2024, September 02). Header Files in C. GeeksforGeeks. https://www.geeksforgeeks.org/header-files-in-c-cpp-and-its-uses/ Durron597., & Dan Lugg. (2015, July 20). How do header and source files in C work?. Stack Overflow. https://stackoverflow.com/questions/5904530/how-do-header-and-source-files-in-c-work

ส่วนการเปรียบเทียบกับภาษา Java

Abstract Methods and Classes. (n.d.). Oracle Java Documentation. https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html Interfaces. (n.d.). Oracle Java Documentation. https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html

ส่วนการเปรียบเทียบกับภาษา Python

5. The import system. (2024, October 10). Python Documentation. https://docs.python.org/3/reference/import.html Python 3: Import Another Python File as a Module. (2021, March 25). Computer Science Atlas. https://csatlas.com/python-import-file-module/

Last updated