Ваш первый фрагмент кода требует, чтобы у любого класса, расширяющего черту, была переменная с именем IR
типа Expressions
.Все члены этой переменной затем импортируются, чтобы их можно было использовать в вашей «связке функций».Экземпляр Expression
является агрегированным .
Во втором примере вы наследуете черту.Для этого необходимо, чтобы класс, реализующий вашу черту, также реализовал черту Expressions
.
Оба примера приводят к одной и той же семантике: реализация всех членов черты Expressions
доступна для вашей "Связкиметоды».Единственное отличие состоит в том, что агрегация немного более гибкая, поскольку вы можете использовать любой объект, который реализует Expressions
.
. Ваш второй пример может рассматриваться как эквивалент первого, если ваша реализация черты определяет val IR = this
.