Attribute Overriding

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

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

class Area():
    pi = 3.14

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

    def surface(self):
        print('surface')


class Rectangle(Area):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def surface(self):
        area = self.width * self.height
        print('The area of rectangle is', area)


class Triangle(Rectangle):
    def __init__(self, edge, height):
        self.edge = edge
        self.height = height

    def surface(self):
        area = self.edge * self.height / 2
        print('The area of triangle is', area)


triangle = Triangle(25, 5)
rectangle = Rectangle(25, 5)

triangle.surface()
rectangle.surface()
The area of triangle is 62.5
The area of rectangle is 125

នៅ​ពេល​ដែល​យើង​បង្កើត method ​នៅ​ក្នុង subclass មាន​ឈ្មោះ​ដូច method នៅ​ក្នុង superclass គេ​និយាយ​ថា method នៅ​ក្នុង subclass របស់​យើង override method នៅ​ក្នុង superclass ។ ក្នុង​ករណី​នេះ method នៅ​ក្នុង subclass ត្រូវ​ហៅ​ថា overriding method និង method នៅ​ក្នុង superclas ត្រូវ​ហៅ​ថា overridden method

មួយវិញទៀត ក្នុង​ករណី​ដែល superclass និង subclass មាន attribute មាន​ឈ្មោះ​ដូច​គ្នា នៅ​ពេល​ដែល​យើង​យក attribute មាន​ឈ្មោះ​ដូច​គ្នា​ទៅ​ប្រើ attribute ដែល​ត្រូវ​យក​ទៅ​ប្រើ គឺ​អាស្រ័យ​ទៅ​លើ instance ដែល​តាម​រយៈ​វា attribute នោះ​ត្រូវ​យក​ទៅ​ប្រើ​។ ជាក់ស្តែង នៅ​ក្នុង​កម្មវិធី​ខាង​លើ method ឈ្មោះ surface() នៃ​ថ្នាក់​ណា​មួយ​ត្រូវ​បាន​ call គឺ​អាស្រ័យ​ទៅ​លើ​ instance ដែល​តាម​រយៈ​វា method នោះ​ត្រូវ​បាន call ។ គឺ​ថា បើ​ជា instance នៃ​ថ្នាក់​ឈ្មោះ Triangle គឺ method ឈ្មោះ surface() នៅក្នុង​ថ្នាក់​ឈ្មោះ Triangle នោះ ដែល​ត្រូវ call ។ តែ​បើ​ជា instance នៃ​ថ្នាក់​ឈ្មោះ Rectangle វិញ គឺ​ជា method ឈ្មោះ surface() នៅ​ក្នុង​ថ្នាក់​ឈ្មោះ Rectangle នោះ ដែល​ត្រូវ​ call ។ ដូច​នេះ method ឈ្មោះ surface() អាច​ប្រែ​ក្រឡា​ជា method នៃ​ថ្នាក់​ណា​មួយ​ក៏​បាន​ដែរ​ គឺ​អាស្រ័យ​ទៅ​លើ instance ដែល​តាម​រយៈ​វា method នោះ​ត្រូវ​យក​ទៅ​ប្រើ​។

នៅ​ក្នុង​ភាសា Python ភាព​ដែល​អាច​ប្រែ​ក្រឡា​បាន​នេះ​ត្រូវ​ហៅ​ថា polymorphism ដែល​ជា​ចំណុច​ដ៏​សំខាន់​មួយ​នៅ​ក្នុង​ការ​សរសេរ​កម្មវីធី​ដោយ​បង្កើត​ថ្នាក់​ផ្សេង​ៗ (OOP) ។

យ៉ាងណាម៉ិញ យើង​បាន​ដឹង​រួច​មក​ហើយ​ថា នៅ​ពេល​ដែល​យើង​យក​ method មាន​ឈ្មោះ​ដូច​គ្នា​មក​ប្រើ​តាម​រយៈ instance របស់ subclass គឺ overriding method នៅ​ក្នុង subclass ដែល​ត្រូវ​បាន call ព្រោះ​វា​ត្រូវ​បាន​រក​ឃើញ​មុន​គេ​។ ក៏​ប៉ុន្តែ បើ​សិន​ជា​យើង​ចង់​អោយ overridden method នៅ​ក្នុង​ superclass ត្រូវ​បាន​ call ដែរ នៅ​ពេល​ដែល overriding method ត្រូវ​បាន call យើង​ត្រូវ​ធ្វើ​ដូច​ខាង​ក្រោម​នេះ​៖

class Area():
    pi = 3.14

    def __init__(self, *dimension):
        self.dimension = dimension

    def surface(self):
        return self.dimension


class Rectangle(Area):
    def __init__(self, width, height):
        super().__init__(width, height)

    def surface(self):
        dimension = super().surface()
        area = self.dimension[0] * self.dimension[1]
        return area


class Triangle(Rectangle):
    def __init__(self, edge, height):
        super().__init__(edge, height)

    def surface(self):
        area = super().surface() / 2
        print('The area of triangle is', area)


triangle = Triangle(25, 5)
triangle.surface()
The area of triangle is 62.5