| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Sumo 06.10.2015 15:49 / 06.10.2015 16:02
... и решает проблему с отсутствием множественного наследования в языке.@main[]
$o[^my::create[]]
^o.print_var_1[]
^o.print_var_2[]
^o._inner_method[]
$o2[^my::create[]]
^o2.print_var_1[]
^o2.print_var_2[]
^o2._inner_method[]
^print_fields[$o2]
# Динамический миксин
$o3[^my2::create[]]
^mix2:include_mixin[$o3]
$o3.var_1[value_3]
^o3.print_var_1[]
^o3.print_var_2[]
^print_fields[$o3]
@print_fields[aObj][locals]
$f[^reflection:fields[$aObj]]
^f.foreach[k;_]{
$k
}
@CLASS
my
@create[]
^mix2:include_mixin[]
^mix3:include_mixin[]
$var_1[value_1]
@CLASS
my2
@create[]
@CLASS
mix
# Базовый класс миксина
@auto[]
$_RESERVED_MIXINS_NAMES_[
$.include_mixin[]
$.__init__[]
]
@static:include_mixin[aContainer][obj]
## aContainer[$caller.self] — если передали миксиним в объект, иначе берем self из caller'а.
$result[]
$obj[^reflection:create[$CLASS_NAME;__init__;^if(def $aContainer){$aContainer}{$caller.self}]]
@__init__[aThis;aOptions][locals]
## aOptions.includePrivate.bool(false) — включать методы, начинающиеся с подчеркивания
$lIncludePrivate(^aOptions.includePrivate.bool(false))
$self.this[$aThis]
$lMethods[^reflection:methods[$CLASS_NAME]]
^lMethods.foreach[m;_]{
^if(^_RESERVED_MIXINS_NAMES_.contains[$m]
|| (!$lIncludePrivate && ^m.left(1) eq "_")
){
^continue[]
}
$this.[$m][$self.[$m]]
}
@CLASS
mix2
# Делаем миксин с двумя методами и переменной var_2
@BASE
mix
@__init__[aThis]
^BASE:__init__[$aThis]
$this.var_2[^math:uuid[]]
@print_var_1[]
$result[$this.var_1]
@print_var_2[]
$result[^_private_method[]$this.var_2]
@_private_method[]
$result[value: ]
@CLASS
mix3
# Миксин с приватны методом.
@BASE
mix
@__init__[aThis;aOptions]
^BASE:__init__[$aThis;$.includePrivate(true)]
# Переменная миксина, которая недоступна в классе-доноре.
$_mixin_var[mv: ^math:uuid[]]
@_inner_method[]
$result[Inner method. ($_mixin_var)]Миксин в этой реализации — специальный вариант класса. Для доступа к переменным класса-приемника используем переменную this вместо self. value_1
value: 1A979D6C-303F-4873-A9E6-85E5F3617950
Inner method. (mv: 29B5BE9F-64D8-4C13-9632-924134EDF66D)
value_1
value: 34C6E147-6839-4F7B-B4BD-66586BFA752A
Inner method. (mv: D09227D2-BEA1-4BDA-8A69-8D9869F5C4AE)
print_var_1
print_var_2
var_2
_inner_method
var_1
value_3
value: 90F44B5C-27D7-4E40-A14C-C446AB528DE4
print_var_1
print_var_2
var_2
var_1Выглядит очень прилично. Похоже пора PF2 делать на миксинах. :)