Method Hiding
ประกฤษฎิ์ อรุณกิจเจริญ 650710563
Method Hiding หมายถึง หมายถึงการซ่อนหรือปกปิด เมธอดของคลาสพ่อแม่ (base class) โดยที่คลาสลูก (derived class) สร้างเมธอดที่มีชื่อเหมือนกันขึ้นมา
แต่ไม่ได้ใช้การสืบทอดผ่านการ override แต่เป็นการสร้างเมธอดใหม่ ซึ่งเมธอดในคลาสลูกจะ "ซ่อน" เมธอดของคลาสพ่อแม่เมื่อมีการอ้างอิงหรือสร้างobjectเป็นประเภทของคลาสลูก
ในภาษา C# เมื่อสร้างเมธอดในคลาสลูกที่มีsignature เหมือนกับเมธอดในคลาสพ่อแม่ แต่ใช้คำสั่ง new
เพื่อบอกคอมไพเลอร์ว่าเมธอดนี้ไม่ใช่การสืบทอดแบบ overriding แต่เป็นการซ่อนเมธอดแทน
ตัวอย่างนี้เป็น Method Hiding แบบ non-static method
จะเห็นว่าในคลาส Parent
มีเมธอด Print()
และ Display()
ในคลาส Child
มีเมธอด Print()
ถูกซ่อนด้วยkeywordnew
, แต่เมธอด Display()
ไม่ได้ถูกซ่อน
ผลลัพธ์เมื่อเรียก Print()
ผ่านออบเจกต์ของ Child
จะเป็นเมธอดจาก Child
เมื่อเรียก Display()
ผ่านObjectของ Child
, เมธอดจาก Parent
จะถูกเรียกใช้เพราะไม่ได้ซ่อน
ตัวอย่างนี้เป็น Method Hiding แบบ static method
มีผลลัพธ์ที่ไม่ต่างกัน ต่างกันแค่การอ้างอิง static method ถูกเรียกใช้จากตัวคลาสโดยตรง (ไม่ต้องสร้างออบเจ็กต์) การเลือกเมธอดจะทำตามประเภทของตัวแปรอ้างอิง (reference type) เสมอ ไม่มีการทำงานแบบ dynamic dispatch
Java
ในภาษา Java นั้น "Method Hiding" เป็นแนวคิดที่คล้ายกับ Method Overriding แต่จะเกี่ยวข้องกับการซ่อนหรือซับซ้อนการทำงานของ method ที่เป็น static ของ superclass โดยการประกาศ method ที่มีลักษณะเหมือนกันใน subclass ซึ่งถ้าเป็นกรณีที่ method เป็น static มันจะทำการ "hide" method ของ superclass แทนที่จะ override เหมือน method ปกติ
แต่อ่านแบบนี้แล้วงง ไปดูตัวอย่างกันดีกว่า
แบบ non-static method
Method hiding จะเกิดเมื่อ มีการใช้ static method
แบบ static method
เมื่อ method เป็น static จะไม่สามารถ override ได้เหมือนกับ method ปกติ แต่สามารถ Method Hiding ในกรณีนี้ method ของ ลูก(Son
) จะซ่อน method ของ แม่ (Mam
) ไว้
C ในภาษา C ไม่มี Method hiding !!!
Python
ใน Python ไม่มีการ Method hiding แต่มีการ Data hiding คือ การซ่อนข้อมูล (attributes) ของคลาส เพื่อป้องกันการเข้าถึงหรือลบข้อมูลโดยตรงจากภายนอกคลาส และควบคุมการเข้าถึงข้อมูลเหล่านั้นผ่านเมธอดเฉพาะ
โดยการใช้ single underscore (_)
หรือ double underscore (__)
ในการทำ data hiding เหมือนกับการซ่อน method นั่นเองครับ
single underscore
(_)
บ่งบอกว่า method หรือ ตัวแปร เป็น private แต่ยังเข้าถึงได้double underscore
(__)
บ่งบอกว่า method หรือ ตัวแปร ถูกเปลี่ยนชื่ออัตโนมัติ (name mangling) เพื่อป้องกันการเข้าถึงโดยตรงจากภายนอก
จะเห็นว่า double underscore เราไม่สามารถเข้าถึงโดยตรงได้ ต้องใช้ method get กับ set เข้ามาช่วย
สรุป
method hiding ช่วยในการซ่อน method จากการเข้าถึงผ่าน method ลูก โดย method ของลูก จะทำงานแทน ซ่อน method แม่ คล้ายกับ method overriding หรือ การที่ซ่อนการเข้าถึงให้ method เข้าถึงยากขึ้น และแต่ละภาษาก็จะมีเงื่อนไขหรือวิธีใช้ต่างกัน
Reference
การใช้ Method hiding in C# และ อะไรคือ Method hiding
static and non-static method มันเกี่ยวกันยังไง ในmethod hiding?
Method hiding in Java?
Method hiding จะมีเมื่อเป็น Static Method
Data hiding in Python
อธิบายการใช้ underscore
Last updated