Классы и объекты в Scala

Содержание

Слайд 2

I. Class

class

Ключевое слово class

В классе могут быть объявлены поля и методы

В общем,

I. Class class Ключевое слово class В классе могут быть объявлены поля
концепция классов схожа с классами в других языках (C++/C#/Java/etc.)

Инициализация полей происходит при создании объекта класса

Если в теле класса определён вызов функции (вне определения какой-либо другой функции), этот вызов будет производиться каждый раз при создании объекта класса

Слайд 3

I. Class

case class

Ключевое слово case class

Должен содержать список полей

Можно провести аналогию между

I. Class case class Ключевое слово case class Должен содержать список полей
кейс-классами в Scala и структурами (structure) в C/C++

Объекты кейс-классов сравниваются по значению (не по ссылке)

Pattern-matching

Копирование с использованием именованных аргументов

Слайд 4

I. Class

конструкторы

Для каждого класса Scala всегда определён один конструктор по умолчанию

Для каждого

I. Class конструкторы Для каждого класса Scala всегда определён один конструктор по
класса Scala может быть определено несколько вспомогательных конструкторов (auxiliary constructors)

Ключевое слово this и def this

Слайд 5

I. Class

список аргументов конструктора и поля класса

Список аргументов конструктора класса и поля

I. Class список аргументов конструктора и поля класса Список аргументов конструктора класса
класса не эквивалентны!

По умолчанию, для аргументов конструктора класса не определены методы получения и передачи значения

Чтобы методы получения значения аргументов класса были определены, необходимо явно указать «val». Аналогично для методов передачи значения, необходимо использовать ключевое слово «var»

Слайд 6

I. Class

список аргументов конструктора и поля класса

Для кейс-классов методы получения значения определены

I. Class список аргументов конструктора и поля класса Для кейс-классов методы получения
по умолчанию

Методы же передачи значения будут определены лишь в случае явного использования «var».
Однако, не стоит прибегать к такой порочной практике: для кейс классов определён метод «copy»!

Слайд 7

I. Class

конструкторы; как мог бы выглядеть Scala класс в C#

В приведённом примере:

Приведена

I. Class конструкторы; как мог бы выглядеть Scala класс в C# В
аналогия реализации одного и того же класса в Scala и C#

Если (var name: String) в Scala, то public string name;
(без readonly)

Если нет полей в Scala, то нет полей и в C#, а конструктор в C# без параметров

Если (val name: String) в Scala, то public string name;
(вместо private)

Слайд 8

II. Object

object

В Scala отсутствует ключевое слово static

object гарантированно создаётся лишь единожды

Конструирование

II. Object object В Scala отсутствует ключевое слово static object гарантированно создаётся
object происходит при первом вызове его метода либо при первом присваивании его переменной

Слайд 9

II. Object

companion object, метод apply

companion object:
- object и class называются одинаково
- определены

II. Object companion object, метод apply companion object: - object и class
в одном файле

Класс может получить доступ к закрытым (private) полям и методам companion object

Метод apply:
-определяется в object
-синтаксис вызова подобен вызову конструктора
-может конструировать экземпляры класса-компаньона
-может возвращать любой тип

Слайд 10

II. Object

case class companion object

Для кейс-класса неявно определён companion object с методом

II. Object case class companion object Для кейс-класса неявно определён companion object
«apply», позволяющим конструировать экземпляры класса
По этой причине при создании экземпляров кейс-класс не обязательно использовать «new»

Если же переопределить метод «apply» в object companion, то можно получить не особо ожидаемое поведение

Слайд 11

III. Модификаторы доступа

модификаторы доступа: protected, private

В Scala отсутствует ключевое слово «public»

По умолчанию,

III. Модификаторы доступа модификаторы доступа: protected, private В Scala отсутствует ключевое слово
все поля и методы публичные

protected: доступ разрешён внутри самой сущности, а также внутри сущностей-наследников

private: доступ разрешён только внутри самой сущности

Модификаторы доступа могут применяться к полям и методам, а также к самим сущностям

Слайд 12

III. Модификаторы доступа

модификаторы доступа: private[this]

В Scala для модификаторов доступа private и protected

III. Модификаторы доступа модификаторы доступа: private[this] В Scala для модификаторов доступа private
допускается указание области действия

Синтаксис:
private[xxx] или protected[xxx], где «xxx» - имя пакета, либо имя сущности, либо «this»

private[this] схож с private, однако, посредством private[this] можно ограничить область доступа для companion object и для экземпляров самой сущности, которые используются в теле сущности

Слайд 13

IV. Интерфейсы

trait

trait в Scala во многом подобен interface в C#/Java

trait может содержать

IV. Интерфейсы trait trait в Scala во многом подобен interface в C#/Java
объявления полей и методов, а также их определения

В отличие от class/object, trait может содержать только объявление, без определения

Нельзя создавать экземпляры trait, можно наследовать class/object от trait (ключевые слова extends/with)

private методы должны быть определены

Слайд 14

IV. Интерфейсы

abstract class

abstract class, также как и trait:
может содержать только объявления методов,

IV. Интерфейсы abstract class abstract class, также как и trait: может содержать
а также может содержать определения полей и методов
private методы должны быть определены
Нельзя создавать экземпляры, можно наследовать class/object

В отличие от trait, для abstract class может быть определён конструктор

Только от одного abstract class можно наследоваться (только ключевое слово extends)

Слайд 15

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

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

Ключевые слова «extends» и «with» определяют наследование сущностей.
При этом, «with» может

V. Наследование наследование Ключевые слова «extends» и «with» определяют наследование сущностей. При
быть использовано только после «extends» и определяет наследование исключительно от trait

В Scala частично допускается множественное наследование: сущность может быть наследована от одного класса
(class/case class/abstract class) и множества trait

Слайд 16

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

override, abstract, super

Методы, перегружаемые в сущности-наследнике помечаются ключевым словом «override»

Ключевое слово

V. Наследование override, abstract, super Методы, перегружаемые в сущности-наследнике помечаются ключевым словом
«abstract» может применяться к полям и методам trait.
В таком случае «abstract» обязывает использовать trait в качестве базового интерфейса для сущности, в которой присутствует реализация этого метода

Ключевое слово «super» предоставляет доступ к полям и методом базовой сущности

Слайд 17

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

полиморфизм при наследовании

Тип экземпляров сущностей наследников может быть (неявно) преобразован к

V. Наследование полиморфизм при наследовании Тип экземпляров сущностей наследников может быть (неявно)
типу базовой сущности

pattern matching может быть использован для уточнения типа экземпляра

Слайд 18

VI. Вложенные сущности

вложенные сущности и анонимные экземпляры

В Scala могут быть определены вложенные

VI. Вложенные сущности вложенные сущности и анонимные экземпляры В Scala могут быть
сущности:
trait/abstract class/class/
case class/object, – внутри друг друга

В Scala допускается создание анонимных экземпляров для trait/abstract class.
Синтаксис:
« new foo(/*ctor params*/)
{/*virtual methods implementations*/} »

Слайд 19

VII. Self types

self types

Синтаксис «self: T => »
в начале определения

VII. Self types self types Синтаксис «self: T => » в начале
сущности

Аналогично механизму наследования, предоставляет доступ к публичным и защищённым полям self type

Объявление self type обязывает наследников также наследоваться от соответствующего типа

Слайд 20

VII. Self types

self types

Использование self type допускает циклические зависимости

self type позволяет

VII. Self types self types Использование self type допускает циклические зависимости self
определять структуру экземпляров сущности без объявления методов этой структуры в самой сущности

Слайд 21

VIII. Sealed, алгебраические типы данных

sealed, алгебраические типы данных

Наследники от sealed должны быть

VIII. Sealed, алгебраические типы данных sealed, алгебраические типы данных Наследники от sealed
объявлены в том же файле

pattern matching: компилятор явно указывает
(генерирует warning)
на отсутствие типов в матчинге

Алгебраический тип данных – составной тип, представляющий тип-сумму из типов-произведений.
Для извлечений значений используется сопоставление с образцом