Другое

Абстрактный класс: определение, назначение и отличия от интерфейса С

Lorem ipsum dolor

Абстрактный класс — это один из принципов объектно-ориентированного программирования. Его используют в языках, которые поддерживают ООП, например:

  • С, 

  • С++,

  • Java,

  • Delphi,

  • и др.

Абстрактный класс в ООП используют, когда нужно реализовать семейство из классов, у которых много всего общего.

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

Интерфейс и абстрактный класс в С

Интерфейс и абстрактный класс в С могут быть взаимозаменяемыми подходами в некоторых случаях. Однако все же они имеют ряд кардинальных различий.

Когда нужно применять абстрактный класс в С:

  1. Если есть несколько родственных объектов и нужно назначить им общий класс.

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

  3. Когда нужно, чтобы потомственные классы разных уровней наследования обладали общими характеристиками. В таком случае изменения характеристик в абстрактном классе коснутся потомков на разных уровнях.

Последний пункт сильно отличается при использовании интерфейса. Потому что при необходимости поменять характеристики во всех связанных классах нужно будет «пройтись» по каждому классу отдельно.

Когда нужно применять интерфейс в С:

  1. Если нужно задать общие характеристики разным объектам, которые могут быть вообще не связаны между собой.

  2. Когда проектируется небольшой тип объектов со схожим функционалом.

Обобщив написанное выше, можно сказать так: если нужно объединить под одним классом объекты с похожими характеристиками, тогда можно применять абстрактный класс. Если нужно объединить «разношерстные» объекты, тогда применять следует интерфейс.

Интерфейс и абстрактный класс в С: пример

Представим ситуацию, что у вас есть собственная транспортная система, которая состоит из:

  • легковых автомобилей;

  • автобусов;

  • микроавтобусов;

  • троллейбусов.

Все транспортные средства являются родственными, со схожими характеристиками. Поэтому их всех можно объединить абстрактным классом «колесный транспорт».

Например:

public abstract class WheeledTransport

{

    public abstract void Move();

}

 

public class PassengerCar : WheeledTransport

{

    public override void Move()

    {

        Console.WriteLine("Легковой автомобиль выехал");

    }

}

 

public class AutoBus : WheeledTransport

{

    public override void Move()

    {

        Console.WriteLine("Автобус выехал");

    }

}

 

public class MicroBus : WheeledTransport

{

    public override void Move()

    {

        Console.WriteLine("Микроавтобус выехал");

    }

}



public class Trolleybus : WheeledTransport

{

    public override void Move()

    {

        Console.WriteLine("Троллейбус выехал");

    }

}

 

Из кода выше все довольно ясно. У нас есть абстрактный класс «WheeledTransport», который объединил внутри себя другие потомственные классы имеющегося транспортного парка.

Однако представим, что бизнес идет в гору и транспортная система стала развиваться быстрыми темпами. У вас в системе появились:

  • самолеты,

  • вертолеты,

  • яхты,

  • лодки,

  • лошади для перевозки людей,

  • собаки для перевозки людей,

  • велосипеды,

  • рикши,

  • и др.

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

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

  • лошади и собаки в классе «животный транспорт»,

  • яхты, паромы, лодки в классе «водный транспорт»,

  • самолеты и вертолеты в классе «воздушный транспорт»,

  • и др.

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

public interface MyTransportSystem

{

     void Move();

}

 

public abstract class WheeledTransport

{

/*Тут будет перечисление потомков класса WheeledTransport */

}

 

public abstract class WaterTransport

 

{

 /*Тут будет перечисление потомков абстрактного класса «WaterTransport»*/

}

 

public abstract class AirTransport

 

{

 /*Тут будет перечисление потомков абстрактного класса «AirTransport»*/

}

 

public abstract class AnimalTransport

 

{

 /*Тут будет перечисление потомков абстрактного класса «AnimalTransport»*/

}

 

Иногда сравнение абстрактного класса и интерфейса приводят в контексте состояния и действия. Абстрактный класс в С фокусирует свое внимание на состоянии потомственных классов, а интерфейс строится вокруг общего действия. В нашем случае все объекты транспортной системы объединены единым действием — перевозкой людей, поэтому мы использовали интерфейс. Если рассматривать отдельные группы транспортной системы, тогда видно, что у них много общих признаков. Например:

  • колесный транспорт — объем двигателя, вид топлива, цвет кузова, наличие музыки, кондиционера и др.;

  • воздушный транспорт — дальность перелета на одной заправке, вид топлива, вместимость, потребность места для взлета и посадки и т. д.;

  • и др.

Совокупность нескольких характеристик образует общее состояние, поэтому в этом случае можно использовать абстрактный класс.

Заключение

Интерфейс и абстрактный класс в С — часто используемые структуры программирования. Сегодня мы описали разницу между ними. Что нужно запомнить, чтобы правильно определить, когда и что использовать? Когда нужно объединить одноплановые объекты под одним классом, тогда используется абстрактный класс. Когда нужно объединить разноплановые объекты под одним классом, тогда используется интерфейс.

Схожие статьи

Все существующие методологии разработки программного обеспечения
Другое

Все существующие методологии разработки программного обеспечения

Микросервисы Java: определение и для чего используются
Другое

Микросервисы Java: определение и для чего используются

Компьютерная графика для начинающих: как создать компьютерную графику?
Другое

Компьютерная графика для начинающих: как создать компьютерную графику?

Что значит парсить в программировании: рейтинг лучших парсеров
Другое

Что значит парсить в программировании: рейтинг лучших парсеров