Encapsulation
ในบทนี้ คุณจะได้เรียนเกี่ยวกับคุณสมบัติการห่อหุ้มข้อมูลหรือ encapsulation ในภาษา Visual Basic
Encapsulation คือคุณสมบัติในการห่อหุ้มข้อมูลในการเขียนโปรแกรมเชิงวัตถุ โดยตัวแปรหรือเมธอดภายในคลาสจะไม่สามารถเข้าถึงได้จากภายนอก ยกตัวอย่างเช่น เมื่อคุณโทรสั่งพิชช่า ภายในไม่กี่สิบนาทีต่อมาคุณจะได้รับพิชช่า คุณไม่จำเป็นต้องทราบว่ามันมีขั้นตอนอะไรบ้างในการที่พิชช่าถาดนี้จะมาถึงคุณ
ในการเขียนโปรแกรม encapsulation นั้นใช้สำหรับปกปิดตัวแปรภายในคลาส และการทำงานของเมธอด สำหรับการทำงานของเมธอด คุณแค่ทราบว่าจะส่งค่าอะไรไปยังเมธอดและสิ่งที่จะได้กับมาคืออะไร
Access modifiers
ในการเขียนโปรแกรมเชิงวัตถุสำหรับ encapsulation นั้น จะมีคำสั่งสำหรับกำหนดการเข้าถึงของตัวแปร เมธอด คลาส หรือชนิดข้อมูลประเภทต่างๆ ซึ่งเรียกว่า access modifier โดยในภาษา Visual Basic มีดังนี้
Access modifier | Access level granted |
---|---|
Public | สามารถเข้าถึงได้จากทุกส่วนของโปรแกรม |
Protected | สามารถเข้าถึงได้ภายในคลาสที่ใช้ประกาศ Protected และในคลาสที่สืบทอดจากคลาสนั้น |
Friend | โค้ดใน assembly ที่ประกาศเป็นแบบ Friend สามารถเข้าถึงได้ |
Protected Friend | โค้ดในคลาสและ assembly เดียวกัน หรือคลาสที่สืบทอดจาก สามารถเข้าถึงได้ |
Private | สามารถเข้าถึงได้เฉพาะภายในคลาสที่ประกาศ Private เท่านั้น |
เราจะยกตัวอย่างการใช้ำงานสำหรับบางคำสั่ง
คำสั่ง Public และ Private
ต่อไปจะเป็นตัวอย่างโปรแกรมในภาษา Visual Basic เพื่อแสดงการทำงานของ encapsulation และทำให้คุณเข้าใจมันมากขึ้น เราจะสร้างคลาสเกี่ยวกับดวงดาวในระบบสุริยะสำหรับตัวอย่าง
Class Star
Public name As String
Private distanceFromSun As Decimal ' in km
Private orbitalTime As Decimal ' in second
Public Sub SetDistance(ByVal d As Decimal)
distanceFromSun = d
End Sub
Public Sub SetOrbitalTime(ByVal day As Decimal)
orbitalTime = day * 86400 ' set time in second
End Sub
Public Function GetOrbitalSpeed() As Decimal
Dim orbitalDistance As Decimal = OrbitDistance()
Dim speedPerSec As Decimal = orbitalDistance / orbitalTime
Return Math.Round(speedPerSec, 2)
End Function
Private Function OrbitDistance() As Decimal
Return 2 * Math.PI * distanceFromSun
End Function
End Class
Module EncapsulationExample
Sub Main()
Dim earth As Star = New Star()
earth.name = "Earth"
earth.SetDistance(152100000)
earth.SetOrbitalTime(365.256)
Console.Write(earth.name & " travels around the sun with speed ")
Console.WriteLine(earth.GetOrbitalSpeed() & " km/s")
End Sub
End Module
นี่เป็นตัวอย่างโปรแกรมในการคำนวณหาความเร็วการโคจรของดวงดาวรอบดวงอาทิตย์ โดยเราได้สร้างคลาส Star
สำหรับในการนำมาสร้างออบเจ็คของดวงดาว และในตัวอย่างเราได้สร้างออบเจ็คของโลกในตัวแปรออบเจ็ค earth
เพื่อใช้งานในการหาความเร็ว
Class Star
Public name As String
Private distanceFromSun As Decimal ' in km
Private orbitalTime As Decimal ' in second
...
ในคลาส Star
เรามีสามตัวแปรโดย name
สำหรับเก็บชื่อของดวงดาว ซึ่งเราประกาศเป็น Public นั่นหมายความว่ามันสามารถเข้าถึงได้จากข้างนอกของคลาส ในโมดูลของการรันโปรแกรม คำสั่ง earth.name
เป็นการเข้าถึงค่าของตัวแปรจากภายนอกคลาสและกำหนดค่าให้กับตัวแปรโดยตรง
ต่อมาเป็นตัวแปร distanceFromSun
และ orbitalTime
ซึ่งมีระดับการเข้าถึงเป็น Private ทำให้เราไม่สามารถเข้าถึงตัวแปรเหล่านี้ได้จากออบเจ็ค earth
เพราะว่าตัวแปรที่เป็น Private สามารถเข้าถึงได้ภายในคลาสเดียวกันเท่านั้น โดยปกติเมื่อเราประกาศตัวแปรในคลาสโดยใช้คำสั่ง Dim
นั้นมันจะทำงานเป็นแบบ Private
Public Sub SetDistance(ByVal d As Decimal)
distanceFromSun = d
End Sub
Public Sub SetOrbitalTime(ByVal day As Decimal)
orbitalTime = day * 86400 ' set time in second
End Sub
เนื่องจากตัวแปรทั้งสองไม่สามารถเข้าถึงได้จากภายนอกคลาส เราได้สร้างเมธอด SetDistance()
และเมธอด SetOrbitalTime()
สำหรับการกำหนดค่าให้กับตัวแปร และเราสามารถเข้าถึงเมธอดนี้ผ่านออบเจ็ค earth
ในโมดูลได้ เพราะเมธอดเหล่านี้ได้ประกาศเป็น Public
ในเมธอด SetDistance()
เพียงแค่นำค่าจากพารามิเตอร์มากำหนดให้กับตัวแปร distanceFromSun
ส่วนเมธอด SetOrbitalTime()
ทำการคำนวณเวลาในวินาทีและเก็บในตัวแปร orbitalTime
Public Function GetOrbitalSpeed() As Decimal
Dim orbitalDistance As Decimal = OrbitDistance()
Dim speedPerSec As Decimal = orbitalDistance / orbitalTime
Return Math.Round(speedPerSec, 2) ' two digits floating point
End Function
Private Function OrbitDistance() As Decimal
Return 2 * Math.PI * distanceFromSun
End Function
สองเมธอดต่อมา เมธอด GetOrbitalSpeed()
เป็นการคำนวณหาความเร็วในการโคจรรอบดวงอาทิตย์ ซึ่งโปรแกรมได้เรียกใช้เมธอด OrbitDistance()
ซึ่งคำนวณระยะทางในการโคจร และเมธอดนี้เป็น Private มันสามารถเข้าถึงได้เฉพาะในคลาสเท่านั้น เราไม่สามารถเข้าถึงโดยตรงจากออบเจ็ค earth
ได้
และในเมใธอด Main()
ของโมดูลหลักของโปรแกรมเป็นการสร้างออบเจ็คในโปรแกรม นี่เป็นผลลัพธ์
Earth travel around the sun with speed 30.28 km/s
คำสั่ง Protected
ในการสืบทอดของคลาสนั้น ตัวแปร เมธอดหรือสมาชิกที่ถูกประกาศเป็นแบบ Private จะไม่ถูกสืบทอดมาด้วย สำหรับคำสั่ง Protected นั้นตัวแปรจะถูกสืบทอดมาด้วย และสามารถเข้าถึงได้ภายใน delivered class เท่านั้น ซึ่งจะไม่สามารถเข้าถึงจากภายนอกหรือโดยตัวแปรของออบเจ็คได้
Class Person
Public name As String
Protected height As Decimal
End Class
Class Programmer
Inherits Person
Public Sub SetHeight(ByVal h As Decimal)
height = h
End Sub
Public Function GetHeightInMeter() As Decimal
Return Math.Round(height * 12 * 2.54, 2)
End Function
End Class
Module ProtecedExample
Sub Main()
Dim prog As Programmer = New Programmer()
prog.name = "Mateo"
prog.SetHeight(5.9) ' set height feet
Console.WriteLine(prog.name & " height is " &
prog.GetHeightInMeter() & " meters")
End Sub
End Module
ข้างบนเป็นตัวอย่างในการใช้คำสั่ง Protected โดยเราได้สร้างคลาส Programmer
ซึ่งสืบทอดมาจากคลาส Person
ถึงแม้ว่าตัวแปรทั้งหมดจะถูกสืบทอดมาด้วย แต่เราไม่สามารถเข้าถึงตัวแปร height
จากออบเจ็คโดยตรงได้ เพราะว่ามันได้ประกาศเป็น Protected ใน base class
ทางเดียวที่จะเข้าถึงตัวแปร height
ได้ ในคลาส Programmer
เราได้สร้างเมธอด SetHeight()
สำหรับการกำหนดค่าความสูงในหน่วยฟุต และเมธอด GetHeightInMeter()
เป็นการรับค่าความสูงในหน่วยเมตร ซึ่งเป็นแบบ Public
Mateo height is 179.83 meters
นี่เป็นผลลัพธ์ของโปรแกรมในการใช้งานคำสั่ง Protected
ทั้งหมดที่คุณได้เรียนในบทนี้ encapsulation จุดประสงค์ก็เพื่อปกปิดข้อมูลและการทำงานนั่นเอง จากตัวอย่างในส่วนของเมธอด Main() จริงๆ แล้วเราไม่รู้ว่าคลาส Programmer
หรือ Person
มีตัวแปร height
อยู่ เพราะว่าเราไม่สามารถเข้าถึงได้ และกับเมธอด มันปกปิดการทำงานภายในทั้งหมด และส่งเพียงผลลัพธ์สุดท้ายให้กับเรา
คำสั่ง Shared
ในภาษา Visual Basic นั้นมีคำสั่งสำหรับการทำงานแบบ global นั่นคือคำสั่ง Shared
ซึ่งจะถูกสร้างขึ้นในตอนที่โปรแกรมคอมไพล์ และสามารถใช้ได้สำหรับทุกที่ มาดูตัวอย่างการใช้คำสั่ง Shared
Public Class sharedClass
Public Shared incrementer As Integer = 0
End Class
Module SharedExample
Sub Main()
sharedClass.incrementer = 3
End Sub
Sub Update()
sharedClass.incrementer = sharedClass.incrementer + 1
End Sub
End Module
เราได้สร้างคลาส sharedClass
ซึ่งภายในคลาสมีตัวแปร incrementer
อยู่ภายในคลาส นั่นหมายความว่าตัวแปรนี้สามารถเข้าถึงได้จากที่ใดๆ ถ้าหากคลาส sharedClass
สามารถเข้าถึงได้ โดยตัวแปรประเภทนี้มักจะใช้สำหรับเก็บข้อมูลที่เป็นหนึ่งเดียวภายในโปรแกรมและสามารถเข้าถึงได้สำหรับทุกส่วนของโปรแกรม เช่น ถ้าคุณนำคลาสนี้ไปสร้างออบเจ็ค ออบเจ็คทั้งหมดจะใช้ตัวแปร incrementer ร่วมกันทั้งหมด เช่นเดียวกับส่วนอื่นๆ ของโปรแกรม
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับคุณสมบัติการสืบทอดในภาษา Visual Basic ซึ่งเป็นคุณสมบัติที่สำคัญในการเขียนโปรแกรมเชิงวัตถุ ที่เราสามารถปกปิดข้อมูลและการทำงานของโปรแกรมจากภายนอกได้