Rakesh N Bhavsar Ответов: 3

Точная разница между наследованием и абстракцией


Может ли кто-нибудь сказать мне, в чем заключается точная разница между наследованием и абстракцией, то есть в каком сценарии я должен использовать только наследование и в каком сценарии я должен использовать только абстрактные классы?

3 Ответов

Рейтинг:
21

thursunamy

Привет,

Конечно, абстракция заинтересована в наследовании. Но есть несколько важных моментов.
Прежде всего, когда вы помечаете класс как абстрактный, вы не можете создать экземпляр. Это очень важно. Абстрактные классы используются только для наследования.

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

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

И конечно, абстракция заинтересована в полиморфизме. Абстракция вынуждает нас к полиморфизму.

Например у вас есть базовый класс сотрудников как показано ниже:

public class Employee
    {
        public string Name { get; set; }
        public double Salary { get; set; }

        public void IncreaseSalary(double rate)
        {
            this.Salary += (this.Salary * rate / 100);
        }
    }


Теперь, когда мы создаем класс SalesRepresentative, как показано ниже, мы должны наследовать его от Employee, потому что SalesRepresentative-это сотрудник.
public class SalesRepresentative : Employee
    {
        public double AnnualSalesAmount { get; set; }
    }



Теперь объект SalesRepresentative имеет метод IncreaseSalary, потому что он унаследован от сотрудника. Но в целом зарплаты торговых представителей и сотрудников увеличиваются по-разному, например, в зависимости от их годовой выручки.

В этом случае вы должны быть в состоянии изменить код метода IncreaseSalary от SalesRepresentative, но вы не можете. На самом деле Теперь вы столкнулись с полиморфизмом

Теперь перейдем к абстракции. Если вы хотите изменить код по умолчанию IncreaseSalary из унаследованного класса, есть 2 варианта. Сначала пометьте метод как виртуальный. И второе-это маркировка его как абстрактного.

Разница в том, если вы пометите его как виртуальный. Вам не нужно реализовывать его в SalesRepresentative, но если вы пометите его как абстрактный, вы должны реализовать его, и вы не должны забывать, что абстрактный член может быть только в абстрактных классах. Рассмотрим пример ниже

public abstract class Employee
   {
       public string Name { get; set; }
       public double Salary { get; set; }

       public abstract void IncreaseSalary(double rate);

   }


public class SalesRepresentative : Employee
    {
        public double AnnualSalesAmount { get; set; }

        public override void IncreaseSalary(double rate)
        {
            if (this.AnnualSalesAmount > 100000)
            {
                this.Salary += (this.Salary * (rate + 5) / 100);

            }
            else
            {
                this.Salary += (this.Salary * rate / 100);
            }
        }
    }


Nima.naqipoor

хорошо объяснил! :)

Рейтинг:
2
Рейтинг:
18

VJ Reddy

Abstraction и Inheritance являются ли важные особенности, имеющие широкое значение в Object Oriented Programming Полные характеристики не могут быть исчерпывающе освещены в коротком ответе, и они подробно рассматриваются в различных книгах и статьях. Однако, чтобы получить быстрое представление, они могут быть описаны следующим образом:

Abstraction с точки зрения объектно-ориентированного программирования, это извлечение основных особенностей объекта для работы, не будучи конкретным в деталях реализации. Например, если мы возьмем транспортное средство, то его можно абстрагировать как объект, имеющий Wheels, Seats, Gears среди прочего, которые могут рассматриваться как члены Vehicle класс, описывающий его состав. Чтобы добавить поведение к транспортному средству, могут быть такие методы, как GiveHorn, Drive, ChangeGear, ApplyBrake и т.д.

Затем определенные классы могут быть получены из этого базового класса с помощью Inheritance. Сказать a Car, a Bus. Так a Car это транспортное средство с 4 колесами, 4 передачами и, скажем, 4 сиденьями. То Drive, Change Gear, Apply brake могут быть реализованы в этом производном классе либо заново, либо они могут использоваться так, как предусмотрено в базовом классе, либо с комбинацией в соответствии с требованиями. Точно так же автобус выводится из класса транспортных средств с помощью наследования и имеет 6 колес, 20 сидений, 5 передач. Эти методы могут быть реализованы, как описано выше.

В этой связи могут быть полезны следующие статьи.
Абстракция (информатика)[^]
Наследование (объектно-ориентированное программирование)[^]

Абстракция и наследование могут быть реализованы либо с помощью Abstract занятия или Interfaces и следующие ссылки могут быть полезны в этом отношении.

Абстрактный класс против интерфейса[^]
Абстрактный Класс Против Интерфейса[^]

Ответы, данные на этот вопрос, также могут быть полезны.
Назначение интерфейсов[^]