วันจันทร์ที่ 27 กุมภาพันธ์ พ.ศ. 2560

9.9 การโอเวอร์ไรด์ python

9.9 การโอเวอร์ไรด์

การโอเวอร์ไรด์

การโอเวอร์ไรด์ เป็นการสร้างเมท็อดของคลาสลูกที่มีชื่อเหมือนกับเมท็อดในคลาสแม่ ซึ่งจากหลักการของการเขียนโปรแกรมเชิงอ็อบเจกต์ ในการใช้งาน ถ้าเมท็อดได้ถูกสร้างขึ้นมาแล้วในคลาสแม่ หากต้องการใช้ฟังก์ชันการทำงานเหมือนกัน จึงไม่จำเป็นต้องสร้างเมท็อดที่คลาสลูกขึ้นมาอีก ดังนั้นวัตถุประสงค์ของการสร้างเมท็อดที่ชื่อเหมือนกับเมท็อดในคลาสแม่ เพื่อต้องการให้อ็อบเจกต์ที่สร้างขึ้นมาจากคลาสลูก ทำงานแตกต่างจากเมท็อดในคลาสแม่ ตัวอย่างการเขียน  UML เพื่ออธิบายหลักการโอเวอร์ไรด์ ดังภาพที่ 9.16

ภาพที่ 9.16 แสดง UML การของคลาสแม่และคลาสลูก

จากภาพที่ 9.16 อธิบายของความสัมพันธ์ของคลาสทั้ง 3 ได้ดังนี้ คลาส Circle และ Square ต่างก็เป็นคลาสลูกได้รับการสืบทอดมาจากคลาส Shapes ซึ่งคลาส Shapes จะประกอบด้วยแอตทริบิวต์ name และมีเมท็อด getName() และ ComputrArea() ดังนั้น ทั้ง      แอตทริบิวต์และเมท็อดของคลาสแม่จะสืบทอดไปยังคลาสลูกได้
                        คลาสลูกประกอบด้วย 2 คลาส ได้แก่ Circle และ Square ดังนี้
                        คลาส Circle มีแอตทริบิวต์ที่แตกต่างจากคลาสแม่ จึงกำหนดขึ้นภายในคลาสตัวเอง มีจำนวน 1 แอตทริบิวต์ ได้แก่ radius และมีเมท็อดที่ชื่อเดียวกันกับคลาสแม่ แต่มีวิธีการคำนวณต่างกัน จึงจำเป็นต้องสร้างขึ้นมาใหม่ ซึ่งสามารถใช้ชื่อเดียวกันได้ วิธีการนี้เรียกว่า    โอเวอร์ไรด์
                คลาส Square มีแอตทริบิวต์ที่แตกต่างจากคลาสแม่ ได้แก่ side มีเมท็อดที่มีลักษณะเดียวกับคลาส Circle คือ ComputeArea() แต่ภายในเมท็อดมีกระบวนการคำนวณหาผลลัพธ์ต่างกัน จึงต้องสร้างขึ้นมาใหม่โดยใช้ชื่อเดิม จัดว่าเป็นโอเวอร์ไรด์ เช่นเดียวกัน การเขียนโปรแกรมเพื่อโอเวอร์ไรด์ ดังภาพที่ 9.17

source code

class Shapes:
    name = ''

    def __init__(self, name):
        self.name = name

    def getName(self):
        return self.name

    def ComputeArea(self):
        return 0.0
ภาพที่ 9.17  แสดงคำสั่งการสร้างคลาส Shapes

จากภาพที่ 9.17 เป็นคำสั่งสร้างคลาส Shapes ประกอบด้วยการประกาศตัวแปรเริ่มต้นให้กับแอตทริบิวต์ name  ถัดจากนั้นได้สร้างคอนสตรักเตอร์ โดยให้รับอาร์กิวเมนต์ name มาเก็บในตัวแปร name  มีการสร้างเมท็อด getName() เพื่อส่งชื่อกลับไปยังเมท็อดที่เรียกใช้ สุดท้ายมีเมท็อด ComputeArea() เพื่อใช้ในการคำนวณพื้นที่ของรูป ในเมท็อดนี้ไม่มีการรับค่าใด ๆ จึงส่งค่า 0.0 ไปยังเมท็อดที่เรียกเมท็อดนี้ สำหรับคำสั่งการสร้างคลาสลูก มีวิธีเดียวกับตัวอย่างของการรับทอด มีรายละเอียดคำสั่งดังภาพที่ 9.18

source code

class Circle(Shapes):
    radius = 0.0

    def __init__(self, name, radius):
        self.name = name
        self.radius = radius

    def ComputeArea(self):
        return 3.14 * self.radius * self.radius

class Square(Shapes):
    side = 0.0

    def __init__(self, name, side):
        self.name = name
        self.side = side

    def ComputeArea(self):
        return self.side * self.side
ภาพที่ 9.18  แสดงคำสั่งการสร้างคลาส Circle และ Square

จากภาพที่ 9.18 เป็นคำสั่งสร้างคลาสลูกซึ่งมีจำนวน 2 คลาส ได้แก่ Circle และ Square ทั้ง 2 คลาสได้รับการสืบทอดมาจากคลาส Shapes ดังนั้นจึงต้องใส่ชื่อคลาสแม่           ไว้ภายในวงเล็บหลังประกาศชื่อคลาส  คลาส Circle มีการประกาศตัวแปรเริ่มต้นให้กับ        แอตทริบิวต์ radius มีค่าเท่ากับ 0.0 จากนั้นได้สร้างคอนสตรักเตอร์ โดยให้รับอาร์กิวเมนต์ name และ radius  มาเก็บในตัวแปร name และ radius  มีการสร้างเมท็อด ComputeArea() เพื่อใช้ในการคำนวณพื้นที่ของรูปวงกลม แล้วส่งค่าผลลัพธ์ไปยังเมท็อดที่เรียกเมท็อดนี้ สำหรับคำสั่งการสร้างคลาส Square มีลักษณะเช่นเดียวกับ คลาส Circle แต่มีที่แตกต่างเฉพาะ          แอตทริบิวต์และสูตรการคำนวณเท่านั้น โปรแกรมนี้มีวัตถุประสงค์เพื่อให้พิจารณาหลักการทำงานของ การโอเวอร์ไรด์ จึงขอให้พิจารณาที่เมท็อด ComputeArea() ทั้ง 3 คลาส จะเห็นว่ามีชื่อเหมือนกัน แต่วิธีการประมวลผลคำสั่งต่างกันเพื่อสะดวกในการใช้งาน ซึ่งวิธีการนี้จะไม่สามารถนำไปใช้ได้กับโปรแกรมภาษาที่ไม่รองรับการเขียนเชิงวัตถุ การเขียนคำสั่งเพื่อสร้าง   อ็อบเจกต์และเรียกใช้เมท็อด มีวิธีการดังแสดงในภาพที่ 9.19

source code

Shape1 = Shapes("Shape1")
print "ชื่อของตัวแปร name :",Shape1.getName()
print "ผลการคำนวณพื้นที่ :",Shape1.ComputeArea()
print "-------------------------------------"

Circle1 = Circle("Circle ",5.5)
print "ชื่อของตัวแปร name :",Circle1.getName()
print "ผลการคำนวณพื้นที่ :",Circle1.ComputeArea()
print "-------------------------------------"

Square1 = Square("Square ",10)
print "ชื่อของตัวแปร name :",Square1.getName()
print "ผลการคำนวณพื้นที่ :",Square1.ComputeArea()
ภาพที่ 9.19  แสดงคำสั่งการสร้างอ็อบเจกต์และเรียกใช้เมท็อดการโอเวอร์ไรด์

จากภาพที่ 9.19 เป็นการเรียกใช้คลาส หรือการเข้าถึงคลาสด้วยการสร้างอ็อบเจกต์ การเรียกใช้เมท็อดหรือฟังก์ชัน จากภาพเป็นการยกตัวอย่างการสร้างอ็อบเจกต์จำนวน 3          อ็อบเจกต์ ได้แก่ Shape1, Circle1 และ Square1 โดย Shape1 สร้างขึ้นจากคลาส Shapes ที่เป็นคลาสแม่ โดยมีอาร์กิวเมนต์เป็นชื่อรูป จากนั้นใช้คำสั่งให้แสดงผล โดยการเรียกเมท็อด getName() และถัดจากนั้นสั่งให้แสดงผลการคำนวณพื้นที่ ได้เรียกใช้เมท็อด ComputeArea() และคำสั่งการสร้างอ็อบเจกต์อื่น ๆ ต่างก็เรียกใช้เมท็อดเดียวกัน ผลลัพธ์ของการทำงานของโปรแกรม ดังภาพที่ 9.20

output

>>>
ชื่อของตัวแปร name : Shape1
ผลการคำนวณพื้นที่ : 0.0
-------------------------------------
ชื่อของตัวแปร name : Circle
ผลการคำนวณพื้นที่ : 94.985
-------------------------------------
ชื่อของตัวแปร name : Square
ผลการคำนวณพื้นที่ : 100
>>> 
ภาพที่ 9.20  แสดงผลลัพธ์การทำงานของการโอเวอร์ไรด์

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

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

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...