ដោយ​ថ្នាក់​ក៏​ជា​ដែនកំណត់​មួយ​ដែរ ដូចនេះ​សម្បត្តិ​នៅ​ក្នុង​ថ្នាក់​និមួយ​ៗ មិន​អាច​ត្រូវ​ច្រឡំ​ទៅ​នឹង​សម្បត្តិ​នៅ​ក្នុង​ថ្នាក់​ផ្សេង​ៗ​ទៀត​បាន​ឡើយ ទោះបី​ជា​វិធី​និង​ឬ​អថេរ​​ទាំងនោះ​មាន​ឈ្មោះ​ដូច​គ្នា​ក៏​ដោយ​។ ម៉្យាងទៀត អត្ថប្រយោជន៍​ជា​សារវន្ត​នៃ​ការបង្កើត​ថ្នាក់ គឺ​ដើម្បី​អាច​បង្កើត​វិធី​​​និង​ឬ​អថេរ​ខុស​ៗ​គ្នា ដែល​មាន​ឈ្មោះ​ដូច​គ្នា ព្រោះ​វិធីនិង​ឬ​អថេរ​មាន​ឈ្មោះ​ដូច​គ្នា​ តែស្ថិត​នៅ​ក្នុង​ថ្នាក់​ខុស​គ្នា គឺ​ជា​វត្ថុ​ខុស​គ្នា​។ ហើយ​បើ​យើង​មិន​បង្កើត​ថ្នាក់​ ដែលជា​កន្លែង​សម្រាប់​បង្កើត​វិធី​និង​ឬ​អថេរ​ផ្សេង​ៗ​ទៀត​នោះ​ទេ បញ្ហា​ឈ្មោះ​ជាន់​គ្នា​នឹង​កើត​មាន​ឡើង​។

 

នៅ​ក្នង​ករណី​មាន​ការបន្ត​ថ្នាក់​ ដែល​នៅ​ក្នុង​នោះ​មាន​សម្បត្តិ​មាន​ឈ្មោះ​ដូច​គ្នា​ នៅ​ពេល​ដែល​សម្បត្តិ​ទាំងនោះ​ត្រូវ​យក​មក​ប្រើ សម្បត្តិ​ដែល​ត្រូវ​រក​ឃើញ​មុន​គេ នឹង​ត្រូវ​យក​មក​ប្រើ​។ ពិនិត្យ​កម្មវិធី​ខាង​ក្រោម​នេះ៖

 

//ការបង្កើត​ថ្នាក់​ឈ្មោះ 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()