Sobes.tech
Junior

Программалоодо кайра жазуу (Overriding) эмне?

sobes.tech AI

AIден жооп

Overriding (Өзгөртүү) — бул подкласс өзүнүн ата-энесинин класында аныкталган методдун өзүнүн ишке ашуусун камсыз кылуу мүмкүнчүлүгү. Подклассындагы кайра аныкталган методдун (аты, параметрлердин саны жана түрлөрү) сигнатурасы ата-энесинин класындагы методдун сигнатурасына толугу менен дал келиши керек. Кайтартуу түрү да ошол эле болушу керек же ата-эненин методунун кайтаруу түрүнүн ковариант (подтип) болушу керек.

Кайра аныктоо негизги аспектилери:

  • Мурас алуу: Кайра аныктоо тек мурас байланыштарында мүмкүн, анда подкласс ата-энесинен методду мурас алат.
  • Полиморфизм: Кайра аныктоо — бул ишке ашыруу убактысында (runtime polymorphism) полиморфизмдин бир механизмдеринин бири. Бул объекттин чындык түрүнө көз каранды болуп, ата-эненин түрү аркылуу чакырылганда, тиешелүү методдун ишке ашырылышы (ата-энеден же подклассдан) болот.
  • @Override ачкыч сөзү: Кээ бир тилдерде (мисалы, Java) @Override аннотациясы колдонулат. Ал туура иштеши үчүн милдеттүү эмес, бирок коддун окумдуулугун жакшыртуу жана компиляция учурунда каталардын алдын алуу үчүн сунушталат, эгер метод эрежелерге туура келбесе.
  • Ата-эненин методуна жетүү: Кайра аныкталган подкласс методунун ичинде көбүнчө ошол методдун ата-энеден келген ишке ашырылышын чакырыш керек болот. Бул үчүн super ачкыч сөзү колдонулат (мисалы, super.metod()).

Java мисалы:

// Ата-эненин классы
class Animal {
    // Ата-эненин класста метод
    void makeSound() {
        System.out.println("Жаныбар үн чыгарат");
    }
}

// Animalдан мурас алган подкласс
class Dog extends Animal {
    // makeSound() методун кайра аныктоо
    @Override
    void makeSound() {
        System.out.println("Ву-вуу!");
    }

    // Ата-эненин методун чакыруу мисалы
    void eat() {
        System.out.println("Ит жейт.");
        super.makeSound(); // Ата-эненин класстагы методун чакыруу
    }
}

class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog(); // Полиморфизм

        myAnimal.makeSound(); // Чыгуу: Жаныбар үн чыгарат
        myDog.makeSound();   // Чыгуу: Ву-вуу! (Кайра аныкталган метод чакырылат)

        Dog specificDog = new Dog();
        specificDog.eat(); // Чыгуу: Ит жейт. 
// Жаныбар үн чыгарат
    }
}

Python мисалы:

# Ата-эненин классы
class Animal:
    # Ата-эненин класста метод
    def make_sound(self):
        print("Жаныбар үн чыгарат")

# Animalдан мурас алган подкласс
class Dog(Animal):
    # make_sound() методун кайра аныктоо
    def make_sound(self):
        print("Ву-вуу!")

    # Ата-эненин методун чакыруу мисалы
    def eat(self):
        print("Ит жейт.")
        super().make_sound() # Ата-эненин класстагы методун чакыруу

# Демонстрация
my_animal = Animal()
my_dog = Dog() # Полиморфизм

my_animal.make_sound() # Чыгуу: Жаныбар үн чыгарат
my_dog.make_sound()   # Чыгуу: Ву-вуу!

specific_dog = Dog()
specific_dog.eat() # Чыгуу: Ит жейт. 
# Жаныбар үн чыгарат

Кайра аныктоо негизги классдын жүрүм-турумун анын өзгөчөлүктөрүнө ылайыкташтыруу үчүн колдонулат жана жалпы интерфейсти сактайт. Бул объект-бакай дизайндын негизги элементтеринин бири.