# Object-Oriented Programming (OOP)

## Classes

* Blueprints for creating objects.

## Abstract Classes

* The purpose is to provide a common definition of a base class that multiple derived classes can share;
* Allow to declare methods without implementation. These methods must be implemented in the child class;
* Abstract classes cannot be instantiated;
* Abstract classes must be extended.

## Objects

* Instances of a class.

## Interfaces

* A class can implement multiple interfaces;
* Interfaces contain only abstract methods (methods without implementation);
* Interfaces cannot contain attributes.

## Inheritance

* A class can inherit attributes and methods from another class;
* The parent class is extended, and child class extends the parent;
* Private attributes and methods are not inherited;
* Specialization is achieved by extending a class. The extending class is called child;
* Generalization is achieved by combining classes into another one. The combined class is called parent.

## Composition

* A class can contain objects of other classes as attributes.
* We can "inject" dependencies by requiring an argument as an instance of another class.

## Encapsulation

* Set visibility to attributes & methods.

## Abstraction

* Abstract classes cannot be instantiated.
* Abstract classes must be extended.
* Allow to declare methods without implementation. These methods must be implemented in the child class.

## Polymorphism

* Change the behaviour of an extended class by overriding methods.
