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);
}
}
}