ដោយថ្នាក់ក៏ជាដែនកំណត់មួយដែរ ដូចនេះសម្បត្តិនៅក្នុងថ្នាក់និមួយៗ មិនអាចត្រូវច្រឡំទៅនឹងសម្បត្តិនៅក្នុងថ្នាក់ផ្សេងៗទៀតបានឡើយ ទោះបីជាវិធីនិងឬអថេរទាំងនោះមានឈ្មោះដូចគ្នាក៏ដោយ។ ម៉្យាងទៀត អត្ថប្រយោជន៍ជាសារវន្តនៃការបង្កើតថ្នាក់ គឺដើម្បីអាចបង្កើតវិធីនិងឬអថេរខុសៗគ្នា ដែលមានឈ្មោះដូចគ្នា ព្រោះវិធីនិងឬអថេរមានឈ្មោះដូចគ្នា តែស្ថិតនៅក្នុងថ្នាក់ខុសគ្នា គឺជាវត្ថុខុសគ្នា។ ហើយបើយើងមិនបង្កើតថ្នាក់ ដែលជាកន្លែងសម្រាប់បង្កើតវិធីនិងឬអថេរផ្សេងៗទៀតនោះទេ បញ្ហាឈ្មោះជាន់គ្នានឹងកើតមានឡើង។
នៅក្នងករណីមានការបន្តថ្នាក់ ដែលនៅក្នុងនោះមានសម្បត្តិមានឈ្មោះដូចគ្នា នៅពេលដែលសម្បត្តិទាំងនោះត្រូវយកមកប្រើ សម្បត្តិដែលត្រូវរកឃើញមុនគេ នឹងត្រូវយកមកប្រើ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
//ការបង្កើតថ្នាក់ឈ្មោះ ThreeD
class ThreeD{
constructor(){
this.pi = 3.14
}
getVolume(){
console.log(`volume`)
}
}
//ការបង្កើតថ្នាក់មួយទៀតឈ្មោះ Cube បន្តចេញពីថ្នាក់ ThreeD
class Cube extends ThreeD{
constructor(width=30,height=15,depth=10){
super()
this.pi = 3.1415
this.width = width
this.height = height
this.depth = depth
}
getVolume(){
this.volume = this.width * this.height * this.depth
console.log(`The volume of cube is ${this.volume}`)
}
}
//ការបង្កើតថ្នាក់មួយទៀតឈ្មោះ Box បន្តចេញពីថ្នាក់ Cube
class Box extends Cube{
constructor(width=25, height=10, depth=5){
super()
this.pi = 3.141592
this.width = width
this.height = height
this.depth = depth
}
getVolume(){
this.volume = this.width * this.height * this.depth
console.log(`The volume of box is ${this.volume}`)
}
}
let boxInstance = new Box()
let cubeInstance = new Cube()
//ការយកទិន្នន័យឈ្មោះដូចគ្នាមកប្រើតាមរយៈសិស្សខុសៗគ្នា
console.log(`The value of pi is ${boxInstance.pi}`)
console.log(`The value of pi is ${cubeInstance.pi}`)
//ការយកវិធីឈ្មោះដូចគ្នាមកប្រើតាមរយៈសិស្សខុសៗគ្នា
boxInstance.getVolume()
cubeInstance.getVolume()
នៅពេលដែលយើងបង្កើតវិធីនៅក្នុងថ្នាក់រង ដូចគ្នាទៅនឹងវិធីនៅក្នុងថ្នាក់មេ គេនិយាយថាយើងបង្កើតវិធីនៅក្នុងថ្នាក់រង បាំង (override) វិធីនៅក្នុងថ្នាក់មេ។ ក្នុងករណីនេះ វិធីនៅក្នុងថ្នាក់រងត្រូវហៅថា វិធីបាំងគេ (overriding method) និងវិធីនៅក្នុងថ្នាក់មេ ត្រូវហៅថា វិធីត្រូវគេបាំង (overridden method) ។
មួយវិញទៀត ក្នុងករណីដែលថ្នាក់មេ និងថ្នាក់រងមានសម្បត្តិមានឈ្មោះដូចគ្នា នៅពេលដែលយើងយកសម្បត្តិណាមួយទៅប្រើ សម្បត្តិដែលត្រូវយកទៅប្រើ គឺអាស្រ័យទៅលើសិស្ស។ ជាក់ស្តែងនៅក្នុងកម្មវិធីខាងលើ ការយកវិធីឈ្មោះ getVolume នៃថ្នាក់ណាមួយទៅប្រើ គឺអាស្រ័យទៅលើសិស្ស ដែលតាមរយៈវា វិធីនោះត្រូវបានយកទៅប្រើ។ គឺថា បើសិស្សជាសិស្សនៃថ្នាក់ឈ្មោះ Box គឺជាវិធីឈ្មោះ getVolume នៃថ្នាក់ឈ្មោះ Box នោះ ដែលត្រូវយកទៅប្រើ។ តែបើសិស្សជាសិស្សនៃថ្នាក់ឈ្មោះ Cube វិញ គឺជាវិធីឈ្មោះ getVolume នៃថ្នាក់ឈ្មោះ Cube ដែលត្រូវយកទៅប្រើ។ នៅក្នុងការសរសេរកម្មវិធីកំព្យូទ័រ ភាពដែលអាចប្រែក្រឡាបាននេះ ត្រូវហៅថា លក្ខណៈប្រែរូប (polymorphism) ដែលជាចំណុចដ៏សំខាន់មួយនៅក្នុងការសរសេរកម្មវិធី ដោយបង្កើតថ្នាក់ផ្សេងៗ (OOP) ។
យើងបានដឹងរួចមកហើយថា នៅពេលដែលយើងយកវិធីមានឈ្មោះដូចគ្នាមកប្រើតាមរយៈសិស្សនៃថ្នាក់រង គឺជាវិធីបាំងគេនៅក្នុងថ្នាក់រង ដែលត្រូវយកទៅប្រើ ព្រោះវាត្រូវបានរកឃើញនៅក្នុងថ្នាក់នោះមុនគេ។ ក៏ប៉ុន្តែ បើសិនជាយើងចង់ឲ្យវិធីត្រូវគេបាំងនៅក្នុងថ្នាក់មេត្រូវយកទៅប្រើដែរ នៅពេលដែលវិធីបាំងគេនៅក្នុងថ្នាក់រងត្រូវយកទៅប្រើ យើងត្រូវធ្វើដូចខាងក្រោមនេះ៖
//ការបង្កើតថ្នាក់ឈ្មោះ ThreeD
class ThreeD{
constructor(){
this.pi = 3.14
}
getVolume(){
console.log(`The volume of object`)
}
}
//ការបង្កើតថ្នាក់មួយទៀតឈ្មោះ Cube បន្តចេញពីថ្នាក់ ThreeD
class Cube extends ThreeD{
constructor(){
super()
this.pi = 3.1415
}
getVolume(width=30,height=15,depth=10){
let volume = width * height * depth
console.log(`The volume of cube is ${volume}`)
super.getVolume()
}
}
//ការបង្កើតថ្នាក់មួយទៀតឈ្មោះ Box បន្តចេញពីថ្នាក់ Cube
class Box extends Cube{
constructor(){
super()
this.pi = 3.141592
}
getVolume(width=25, height=10, depth=5){
let volume = width * height * depth
console.log(`The volume of box is ${volume}`)
super.getVolume()
}
}
let boxInstance = new Box()
//ការយកវិធីឈ្មោះដូចគ្នាតៗគ្នាមកប្រើ
boxInstance.getVolume()