- Регистрация
- 9 Май 2015
- Сообщения
- 1,071
- Баллы
- 155
- Возраст
- 51
При работе над архитектурой приложения иногда возникает дилемма. Что выбрать: интерфейс или всё-таки абстрактный класс?
Попробуем изучить этот вопрос и найти на него ответ.
В начале разберёмся что же такое интерфейс и что такое абстрактный класс.
Таким образом интерфейс, это всего лишь список методов без реализации. В тоже время абстрактный класс может содержать реализацию даже для своих методов. Также интерфейс не может включать в себя поля, а методы интерфейса могут быть только открытыми (возможны исключения из этого правила).
Интерфейсы поддерживают множественное наследование. Как следствие их широко используют в языках, где множественное наследование классов запрещено (C#, Java и т.д.).
Исходя из этого можно сделать следующий вывод.
В любом из этих случаев лучше использовать интерфейсы.
Если же требуется описать общую для всех наследников реализацию или структуру хранения данных в виде полей или свойств, здесь уже нужен абстрактный класс.
Иными словами, в данном вопросе нужно следовать золотому правилу разработки: «Технология выбирается под задачу».
Как это ни странно, но, казалось бы, сложный вопрос на самом деле решается настолько просто и очевидно исходя всего лишь на всего из определений рассматриваемых элементов объектно-ориентированного программирования.
К сожалению, изучая программирование многие делают основной упор на его практическую составляющую. В тоже время, как показывает в том числе данный пример, изучение теории не менее важно для программиста, чем упражнения в собственно написании программ. Ведь от того насколько грамотно будет спроектирована архитектура приложения во многом зависит его судьба.
Попробуем изучить этот вопрос и найти на него ответ.
В начале разберёмся что же такое интерфейс и что такое абстрактный класс.
- Абстрактный класс – класс, который не предполагает создания экземпляров;
- Интерфейс – перечисление сигнатур методов, которые должны бить реализованы у наследующего его класса.
Таким образом интерфейс, это всего лишь список методов без реализации. В тоже время абстрактный класс может содержать реализацию даже для своих методов. Также интерфейс не может включать в себя поля, а методы интерфейса могут быть только открытыми (возможны исключения из этого правила).
Интерфейсы поддерживают множественное наследование. Как следствие их широко используют в языках, где множественное наследование классов запрещено (C#, Java и т.д.).
Исходя из этого можно сделать следующий вывод.
- Если программа пишется на языке, который не поддерживает множественное наследование классов, а оно требуется;
- Если базовый абстрактный класс сводится лишь к описанию абстрактных методов;
- Если требуется поддержка единого перечня преимущественно открытых методов с единой сигнатурой.
В любом из этих случаев лучше использовать интерфейсы.
Если же требуется описать общую для всех наследников реализацию или структуру хранения данных в виде полей или свойств, здесь уже нужен абстрактный класс.
Иными словами, в данном вопросе нужно следовать золотому правилу разработки: «Технология выбирается под задачу».
Как это ни странно, но, казалось бы, сложный вопрос на самом деле решается настолько просто и очевидно исходя всего лишь на всего из определений рассматриваемых элементов объектно-ориентированного программирования.
К сожалению, изучая программирование многие делают основной упор на его практическую составляющую. В тоже время, как показывает в том числе данный пример, изучение теории не менее важно для программиста, чем упражнения в собственно написании программ. Ведь от того насколько грамотно будет спроектирована архитектура приложения во многом зависит его судьба.