Введение по переопределению в ООП

При реализации концепции наследования в oops все функции в родительском классе используются всеми его производными классами. Но в случае, если один производный класс хочет конкретную реализацию функции, которая была объявлена ​​в родительском классе, но с тем же именем, той же сигнатурой и тем же типом возврата, тогда используется переопределяющая функция. Переопределение позволяет дочернему классу переопределить функцию, которая уже была определена в его родительском классе или суперклассе. Таким образом, можно использовать оба определения, указав объект класса при вызове метода. Например, пусть есть функция sum как в родительском, так и в дочернем классе, и при вызове функции мы используем объект дочернего класса, тогда будет вызван метод, присутствующий в дочернем классе, и вместо этого, если вы используете объект родительского класса, тогда метод в родительском классе будет называться. говорят, что этот метод в дочернем классе переопределяет метод, присутствующий в его суперклассах.

Необходимость переопределения метода

Ниже приведены методы переопределения:

  • Переопределение метода полиморфизма во время выполнения помогает достичь полиморфизма во время выполнения в объектно-ориентированных языках программирования, таких как c ++, java, c # и т. Д.
  • Полиморфизм означает наличие многих форм, то есть одной сигнатуры и нескольких определений. в объектно-ориентированных языках, когда и производный, и родительский класс имеют одно и то же имя и сигнатуру функции, тогда одноразовый компилятор разрешает определение, которое ему нужно вызвать. Полиморфизм времени исполнения означает, что привязка определения метода к вызываемому методу происходит во время выполнения программы. Это позволяет реализовать аспект полиморфизма «одно сигнатурное множественное определение». Эта функция использует динамическую диспетчеризацию методов, которая имеет мощную концепцию объектно-ориентированного проектирования для обеспечения повторного использования кода и надежности. Переопределение метода позволяет нам вызывать метод любого из его производных классов, не зная тип объекта производного класса.
  • Используя эту функцию, можно реализовать специализированное определение для обобщенной функции, которая была унаследована от ее суперкласса.

Как переопределение работает в ООП?

Нижеследующее объяснение говорит о том, как работает переопределение:

  • ООП помогают нам реализовать полиморфизм во время выполнения, унаследовав функции класса в другой. Давайте посмотрим на работу переопределения в ООП. Позже предположим, что у нас есть животное с именем суперкласса, у которого есть две функции: говорить и есть. Есть два подкласса: кошка и собака, которые расширяют имя животного суперкласса.
  • Эти два подкласса используют одни и те же функции, говорят и говорят, но изменяют реализацию, но сохраняют сигнатуру методов одинаковыми. Теперь в нашем методе main, если вы вызываете эти функции, выбирая ссылочную переменную, то только во время выполнения будет решено, какую функцию нужно вызвать. Например, если объект содержит разность дочернего класса, который является кошкой или собакой, то функция соответствующего класса будет вызываться иначе, если объект содержит ссылку на родительский класс, то будет вызвана функция класса животного.
  • Здесь мы должны увидеть, что вызываемая функция не зависит от типа ссылочной переменной. Это решается компилятором только во время выполнения, это помогает реализовать полиморфизм во время выполнения. Это также помогает реализовать специализированное определение метода общего определения метода в родительском классе.

Код:

class Animal(
//Overridden method
public void eat()
(
System.out.println("Animal is eating");
)
public void speak()
(
System.out.println("Animal is speaking");
)
)
class Cat extends Animal(
//Overriding method
public void eat()
(
System.out.println("Cat is eating");
)
public void speak()
(
System.out.println("Cat is meowing");
)
)
class Dog extends Animal(
//Overriding method
public void eat()
(
System.out.println("Dog is Barking");
)
public void speak()
(
System.out.println("Dog is speaking");
)
)
public class Test(
public static void main(String() args)(
Animal an=new Dog();
Animal an1 = new Cat();
Animal an2 = new Animal();
an.speak();
an.eat();
an1.speak();
an1.eat();
an2.eat();
)
)

Выход:

Примечание. Ссылочная переменная дочернего типа не может использоваться для хранения ссылки на родительский тип.

Правила переопределения метода

Ниже приведены правила переопределения:

Правило № 1

Список параметров, объявленных в функции родительского класса, должен соответствовать списку параметров, упомянутых в определении метода переопределения в дочернем классе.

Например:

Метод в родительском классе

public int test1(int a);

Метод в дочернем классе - public string test1 (); // Переопределение метода здесь не будет поддерживаться, так как тип возвращаемого значения и аргументы различаются, но ошибки времени компиляции не будет. Этот метод будет рассматриваться как новый метод дочернего класса.

Правило № 2

Тип возвращаемого значения метода, присутствующего в дочернем классе, должен быть таким же или подтипом типа возвращаемого значения переопределяемого метода.

Например:

Метод в родительском классе

public Object test1(int a);

Метод в дочернем классе

public String test1();

некорректный

Метод в родительском классе

public String test1(int a);

Метод в дочернем классе

public Object test1();

Правило № 3

Спецификатор доступа, присутствующий в методе родительского класса, должен быть в равной степени ограничивающим или более ограничительным, чем метод, который переопределяет его в дочернем классе.

некорректный

Метод в родительском классе

public int test1(int a);

Метод в дочернем классе

private int test1() ; // more restrictive than public one

Правило № 4

Только метод экземпляра со спецификатором доступа в качестве публично защищенного или по умолчанию может быть переопределен. Это потому, что только этот метод экземпляра может быть унаследован его подклассом и, таким образом, считается переопределенным. В случае, если метод экземпляра, указанный в родительском классе, является более ограниченным, например, открытый метод, он не будет наследоваться в своем подклассе, и он делает, если кто-либо определяет тот же метод в подклассе, этот сценарий не принимается как метод, переопределяющий, так как публичные методы не могут наследоваться, это не может быть переопределено.

Например:

Метод в родительском классе

public int test1(int a); //can be inherited and overridden

Метод в дочернем классе

private int test1();

некорректный

Метод в родительском классе

private int test1(int a); //can not be inherited and overridden

Метод в дочернем классе

private int test1();//not overriding method of the parent class

Это рассматривается как новый закрытый метод дочернего класса.

Правило № 5

Ключевое слово super может использоваться для вызова функции родительского класса, которая была переопределена его подклассом.

class Animal(
//Overridden method
public void eat()
(
System.out.println("Animal is eating");
)
public void speak()
(
System.out.println("Animal is speaking");
)
)
class Dog extends Animal(
//Overriding method
public void eat()
(
System.out.println("Dog is Barking");
)
public void speak()
(
super.speak(); // Here super keyword is used to call the speak function of the super class.ieAnimal
)
)
public class Test(
public static void main(String() args)(
Animal an=new Dog();
Animal an2 = new Animal();
an.speak();
an.eat();
an2.eat();
)
)

Выход:

Правило № 6

Конструктор класса не может быть переопределен его подклассами, так как конструктор двух классов не может быть одинаковым.

Правило № 7

Обработка исключений в переопределении.

  • Метод Incase в родительском классе не генерирует никаких исключений, тогда переопределяющему методу, присутствующему в подклассе, разрешается выбрасывать только непроверенное исключение. Если переопределяющий метод показывает проверенное исключение, то компилятор покажет ошибку.
  • Если метод в родительском классе, который переопределяется, генерирует метод переопределения тандемов исключений, присутствующий в подклассе, он должен проходить через исключение того же уровня или его подтипа в иерархии исключений или вообще без исключения.

Правило № 8

Переопределение метода в многоуровневом наследовании также возможно.

Код:

class Creature (
//Overriding method
public void eat()
(
System.out.println("Creature is eating");
)
public void speak()
(
System.out.println("Creature is speaking");
)
)
class Animal extends Creature(
//Overridden method
public void eat()
(
System.out.println("Animal is eating");
)
public void speak()
(
System.out.println("Animal is speaking");
)
)
class Dog extends Animal(
//Overriding method
public void eat()
(
System.out.println("Dog is Barking");
)
public void speak()
(
System.out.println("Dog is speaking");
)
)
public class Test(public static void main(String() args)(
Creature an=new Dog();
Animal an1 = new Animal();
Animal an2 = new Dog();
an.speak();
an.eat();
an1.speak();
an1.eat();
an2.eat();
)
)

Выход:

Правило № 9

Переопределение правил метода в Java

  • Синхронизированный метод может быть легко переопределен несинхронизированным методом и наоборот.
  • Абстрактный метод, присутствующий в абстрактных классах или интерфейсах, предназначен для перезаписи, чтобы обеспечить конкретную реализацию для объявленных методов, иначе он покажет ошибку во время компиляции.
  • Определение статического метода с тем же именем, что и у статического метода, присутствующего в родительском классе, называется методом, не скрывающим переопределение метода, поскольку он не реализует полиморфизм времени выполнения.
  • Окончательные методы не могут быть переопределены.

Правило № 10

Переопределение метода в C ++

Переопределение метода в c plus достигается путем объявления метода как виртуального. Виртуальное ключевое слово используется для достижения полиморфизма во время выполнения в c ++. Тогда как в Java все функции по умолчанию считаются виртуальными.

Правило № 11

Переопределение метода отличается от перегрузки метода, поскольку это процесс полиморфизма во время выполнения, тогда как перегрузка и метод являются примером полиморфизма во время компиляции. При переопределении метода необходимо, чтобы сигнатура метода оставалась неизменной. когда мы вносим какие-либо изменения в тип возвращаемого метода или список параметров, компилятор воспринимает это как перегрузку метода.

Переопределение метода Перегрузка метода
class A(
public void test()(
System.out.println("In class A");
)
)
class B extends A(
public void test()(
System.out.println("In class A");
))public class Test(
public static void main(String() args)(
A a=new B();
a.test();
A b =new A();
b.test();
))
class A(
public void test()(
System.out.println("Method without arguments");
)
public void test(int x)(
System.out.println("Method with arguments");
System.out.println(x);
))public class Test(
public static void main(String() args)(
A a=new A();
a.test();
a.test(2);
)
)

Выход:

Когда использовать метод переопределения?

Ниже приведены методы использования переопределения:

  • ООП обеспечивает замечательную возможность наследования для формирования большой иерархии между суперклассом и подклассом - от меньшей специализации к большей специализации.
  • Можем ли мы использовать суперкласс, чтобы обеспечить структуру, которая может быть унаследована во всех его подклассах, и подклассы, которые мы можем определить различное функционирование этих методов. Это достигается путем переопределения функции, где специализированное функционирование может быть предоставлено унаследованным методам init подклассам.
  • Это также помогает обеспечить структуру для нескольких классов, предоставляя набор переменных и метод, который должен быть реализован во всех его подклассах.

Вывод

ООП, концепции делают код надежным и простым для повторного использования, когда они используются эффективно. Функция переопределения расширяет возможности использования наследования для предоставления конкретной реализации универсальному методу родительского класса. В его подклассах. Это использует концепцию полиморфизма во время выполнения, чтобы вызвать правильное определение метода. Динамическая диспетчеризация метода выполняется только во время выполнения, которая проверяет ссылку на класс, который содержит объект для вызова метода. Эта функция руководствуется различными правилами и не распространяется на статические методы. Мы можем реализовать переопределение методов на любом объектно-ориентированном языке и сделать нашу программу более быстрой и надежной.

Рекомендуемые статьи

Это руководство по переопределению в ООП. Здесь мы обсудим, как переопределение работает в ООП, когда его использовать, и 11 правил с кодами и выводом. Вы также можете просмотреть другие наши статьи, чтобы узнать больше-

  1. Переопределение в PHP
  2. Переопределение в JavaScript
  3. Что такое ООП?
  4. Переопределение метода в C #
  5. Примеры переопределения в Java
  6. Статический метод JavaScript | Как работать с примерами