Назначение паттерна, в котором объект расширяет одноименный признак - объект Live extends Live

Я пытаюсь Zio.

Я не понимаю, почему Live добавляется как Trait, а затем object предоставляется, например:

object Live extends Live

Этот узор встречается в разных местах, например zio.console.Console.

Есть ли причина или есть случаи, когда в этом есть смысл?

2 ответа

Решение

То, что вы видите в ЗиО является использование шаблона под названием Самоотверженный Черта.

Чтобы реализовать паттерн самоотверженности, вы просто предоставляете объект-компаньон для характеристики, которая сама смешивается с этой чертой.

trait Greeting {
  def greet() { println("hi there") }
}

object Greeting extends Greeting

Затем у пользователя библиотеки есть выбор: смешать Greeting:

object MixinExample extends Application with Greeting {
  greet()
}

или импортировать членов Greeting сопутствующий объект, например:

import Greeting._

object ImportExample extends Application {
  greet()
}

Просто как дополнение к ответу Кшиштофа Атласика.

Как упоминалось в комментарии jq170727, вы найдете здесь эти два случая: Introduction
-a-database-module

Object:

В худшем случае, если у нас мало времени и нам нужно отправить код сегодня, может быть, мы решим предоставить производственную базу данных везде, где мы вызываем InvitFriends.

inviteFriends(userId).provide(DatabaseLive)

В этом случае вместо использования DefaultRuntime, поставляемого с ZIO, мы можем определить нашу собственную среду выполнения, которая предоставляет модуль производственной базы данных):

val myRuntime = Runtime(DatabaseLive, PlatformLive)

Trait:

Когда у вас несколько сред выполнения.

val myRuntime = 
  Runtime(
    new  DatabaseLive 
    with SocialLive 
    with EmailLive, PlatformLive)
Другие вопросы по тегам