Основы ООП
Сегодня речь пойдет об одном из базовых приниципов в программировании - ООП. 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На этом все. До пятницы!