Если бы я пытался объяснить классы и объекты кому-то совершенно незнакомому с программированием, я, вероятно, использовал бы что-то вроде следующего:
Класс - это просто " рецепт для вещи", класс состоит из разных типов "ингредиентов", которые имеют разные характеристики (то есть POD и функции / методы).
Таким образом, в нем содержатся только описания макета (строительных блоков) и функциональности.
Ингредиенты могут быть различного типа: «данные» в том смысле, что они содержат фактические поля данных (представьте факты, хранящиеся в переменных / полях ), и «действие» в том, что они содержат специфические методы для выполнения действий.
Некоторые ингредиенты могут быть секретными , возможно, вы не захотите делиться всеми ингредиентами или не захотите поделиться некоторыми конкретными способами выполнения определенных действий с рецептом ( encapsulation ).
Таким образом, у вас как у повара есть возможность ограничить доступ к ингредиентам, так что пользователи вашего рецепта должны придерживаться вашего рецепта и просто использовать "предварительно консервированные" шаги (методы) выполнения вещи, которые вы предоставляете (без необходимости знать, о чем речь):
Некоторые ингредиенты могут быть предназначены только для внутреннего видения ( частный доступ), поскольку они действительно имеют отношение только к этому конкретному экземпляру / проявлению рецепта / класса, в то время как другие также могут быть доступны из рецептов, которые основаны на этом рецепте (думаю, настройки), которые вытекают из него ( защищенный доступ).
И затем есть компоненты, которые должны быть в общем видимы и доступны для всех пользователей рецепта ( public ), потому что они составляют «интерфейс» или «интерфейс» конечного продукта (они не Обязательно нужно знать о внутренних / низкоуровневых реализациях).
Как только класс фактически используется для реализации определенного рецепта, создается новый объект (создается экземпляр класса): шоколадный торт - это всего лишь одно проявление / версия рецепта шоколадного торта. Может быть много других версий, использующих тот же самый «рецепт».
Если вам нужно объединить несколько рецептов (например, шоколадный торт и лимонный торт), вы можете создать новый рецепт, который будет производиться от обоих рецептов, в основном создавая совершенно новый рецепт, который будет иметь характеристики оригинальных рецептов ( несколько наследование ).
Благодаря тому, что новые рецепты основаны на существующих рецептах с использованием наследования, изменения в оригинальном рецепте можно напрямую импортировать в новый рецепт. Аналогично, наличие общего рецепта предка (тип / суперкласс) означает, что его свойства (поля и методы) можно ожидать во всех подклассах (наследуемые / дочерние рецепты), другими словами, общий «рецепт шоколадного торта» может быть используется для создания двух новых специализированных версий шоколадного торта: «белый шоколадный торт» и «темный шоколадный торт», где цвет шоколада просто становится атрибутом, который можно настроить с помощью специального метода для шоколадного торта, такого как «setChocolateColor ()» .
Если вы хотите, чтобы ваш рецепт давал возможность новым рецептам переопределять некоторые компоненты вашего рецепта, вы можете предоставить стандартные действия (методы), которые можно переопределить индивидуально ( виртуальное наследование ).