Сегодня речь пойдет об одном из базовых приниципов в программировании - ООП. Swift и Kotlin принадлежат семейству ООП языков. Поэтому крайне важно хорошо знать базовые понятия, чтобы писать легко поддерживаемый и расширяемый код.

Что такое ООП?

ООП - (Объектно Ориентированное Программирование) методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.

Основные понятия

Класс

Класс - это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).

// Объявление класса ExampleClass
class ExampleClass {
	
	var myProperty: Int = 0

}
// Объявление класса ExampleClass
class ExampleClass {
	
	var myProperty: Int = 0

}

Объект

Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом.

// Создаем экземпляр класса 
val exampleObject = ExampleClass()
// Напечатаем переменную myProperty опредленную в классе ExampleClass
println(exampleObject.myProperty)
// Создаем экземпляр класса 
let object = ExampleClass()
// Напечатаем переменную myProperty опредленную в классе ExampleClass
print(object.myProperty)

Интерфейс

Интерфейс – это набор методов класса, доступных для использования другими классами.

interface MyInterface {

	fun doSomething()

}
// Объявление интерфейся MyInterface
protocol MyInterface {

	func doSomething()

}

Основные принципы

Инкапсуляция

Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.

class ExampleClass {
	
	var myProperty: Int = 0

	fun doSomething() {
		println("This function do something")
	}

}
// Объявление класса ExampleClass. 
// Переменная myProperty и функция doSomething инкапсулированы в классе ExampleClass.
class ExampleClass {
	
	var myProperty: Int = 0

	func doSomething() {
		print("This function do something")
	}

}

Абстрагирование

Абстрагирование – это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция – это набор всех таких характеристик.

// Объявление класса Dog. 
// Пусть, значимые переменные собаки это имя, хозяин, а функция лаять. 
// Мы понимамаем, что у собаки также есть порода, рост, вес и прочее, но мы опускаем данные характеристики
class Dog(val name: String, val owner: String) {

	fun bark() {
		print("WOOF-WOOF-WOOF")
	}

}
// Объявление класса Dog. 
// Пусть, значимые переменные собаки это имя, хозяин, а функция лаять. 
// Мы понимамаем, что у собаки также есть порода, рост, вес и прочее, но мы опускаем данные характеристики
class Dog {
	
	let name: String
	var owner: String

	init(name: String, owner: String) {
		self.name = name
		self.owner = owner
	}

	func bark() {
		print("WOOF-WOOF-WOOF")
	}

}

Полиморфизм

Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

// Объявление интерфейся MyInterface
interface MyInterface {

	fun doSomething()

}

// Первая реализация интерфейся MyInterface
class Implementation1: MyInterface {
	
	override fun doSomething() {
		print("Doing something")
	}

}

// Вторая реализация интерфейся MyInterface
class Implementation2: MyInterface {
	
	override fun doSomething() {
		print("Doing nothing")
	}

}

// Объявим перменную, которая будет иметь тип MyInterface
val exampleObject: MyInterface

// Тогда мы можем присвоить данной переменной как объект класс Implementation1, так и класс Implementation2.
// Причем обращаемся мы к ним через интерфейс MyInterface.
exampleObject = Implementation1()
exampleObject.doSomething() // Doing something

exampleObject = Implementation2()
exampleObject.doSomething() // Doing nothing
// Объявление интерфейса MyInterface
protocol MyInterface {

	func doSomething()

}

// Первая реализация интерфейся MyInterface
class Implementation1: MyInterface {
	
	func doSomething() {
		print("Doing something")
	}

}

// Вторая реализация интерфейся MyInterface
class Implementation2: MyInterface {
	
	func doSomething() {
		print("Doing nothing")
	}

}

// Объявим перменную, которая будет иметь тип MyInterface
var object: MyInterface

// Тогда мы можем присвоить данной переменной как объект класс Implementation1, так и класс Implementation2.
// Причем обращаемся мы к ним через интерфейс MyInterface.
object = Implementation1()
object.doSomething() // Doing something

object = Implementation2()
object.doSomething() // Doing nothing

Наследование

Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым или родительским. Новый класс – потомком, наследником или производным классом.

// Объявление класса ExampleClass
class ParentClass {
	
	var myProperty: Int = 0

}

// Создаем класс ChildClass потомка ParentClass
class ChildClass: ParentClass {
	
	var anotherProperty: Int = 1

}

val child = ChildClass()
// Нам доступны параметры класс предка
println(child.myProperty) // 0
// Объявление класса ExampleClass
class ParentClass {
	
	var myProperty: Int = 0

}

// Создаем класс ChildClass потомка ParentClass
class ChildClass: ParentClass {
	
	var anotherProperty: Int = 1

}

let child = ChildClass()
// Нам доступны параметры класс предка
print(child.myProperty) // 0

На этом все. До пятницы!