Здравствуйте, neFormal, Вы писали:
F>А можно в каких-нибудь динамических языках отменить наследование?
В javascript-е классы эмулируются через использование прототипов. Соответственно, сменив прототип прототипа можно "как бы" сменить его "как бы" базовый класс.
F>Если да, то как это реализовано в синтаксисе?
Здравствуйте, Курилка, Вы писали:
F>>А можно в каких-нибудь динамических языках отменить наследование? F>>Если да, то как это реализовано в синтаксисе? К>Что ты имеешь в виду под "отменить наследование"? final из жабы и sealed из шарпа?
Нет, я про возможность заявить "этот класс больше не наследник вот этого класса". Под это так же подпадает вариант "сменить родителя", как рядом сказал Lloyd.
Здравствуйте, neFormal, Вы писали:
F>Здравствуйте, Курилка, Вы писали: К>>Что ты имеешь в виду под "отменить наследование"? final из жабы и sealed из шарпа? F>Нет, я про возможность заявить "этот класс больше не наследник вот этого класса". Под это так же подпадает вариант "сменить родителя", как рядом сказал Lloyd.
Ну вот из питона возможно такое покатит тогда:
>>> class X(object):
... x = 1
...
>>> x=X()
>>> x.x
1
>>> class Y(object):
... y = 1
...
>>> x.__class__ = Y
>>> x.y
1
>>> x.x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Y' object has no attribute 'x'
Здравствуйте, Курилка, Вы писали:
F>>Нет, я про возможность заявить "этот класс больше не наследник вот этого класса". Под это так же подпадает вариант "сменить родителя", как рядом сказал Lloyd. К>Ну вот из питона возможно такое покатит тогда: К>
>>>> x.__class__ = Y
Чорд, похоже я не так понял Lloyd-а.
Меня интересует смена дерева наследования класса, а не смена класса у объекта (хотя это тоже забавная штука).
В питоне это, наверное, выглядело бы, как:
>>>> class Foo: x = 1
>>>> class Bar(Foo): y = 2
>>>> Bar.__parent__
Foo
Ну и со всеми вытекающими динамическими извратами.
Здравствуйте, neFormal, Вы писали:
F>Здравствуйте, c-smile, Вы писали:
CS>>
CS>>class A: Behavior
CS>>
CS>>Используется например если некий DOM элемент имеет два разных состояния которые требуют принципиально разных способов обработки событий.
F>А есть что-нибудь вроде? F>
F>A._parent = MyAnotherBehavior
F>
Угу. class это такой же object как и все остальное. Т.е. у него можно тоже менять prototype (parent в твоей терминологии)
class A: Behavior
{
function onClick() { stdout.println("I am an A object"); }
}
class B: Behavior
{
function onClick() { stdout.println("I am a B object"); }
}
Здравствуйте, ShaggyOwl, Вы писали:
F>>Меня интересует смена дерева наследования класса, а не смена класса у объекта (хотя это тоже забавная штука). SO>Признаться не очень понимаю, зачем оно надо, но
ну, иногда может захотеться один класс, который в каких то случаях наследует большой тяжёлый функционал, а в других — нет..
ну или как показал рядом c-smile пример с событиями..
SO>И этот кортеж можно поменять. SO>То, что надо?
Здравствуйте, neFormal, Вы писали:
F>А можно в каких-нибудь динамических языках отменить наследование? F>Если да, то как это реализовано в синтаксисе?
В Perl каждый класс имеет специальный массив @ISA (is a), содержащий список родительских классов. Соответственно, можно производить с ним какие-то манипуляции. Специальных синтаксических конструкций для этого нет, работать полагается так же, как и с любыми другими массивами.
F>>>Меня интересует смена дерева наследования класса, а не смена класса у объекта (хотя это тоже забавная штука). SO>>Признаться не очень понимаю, зачем оно надо, но
F>ну, иногда может захотеться один класс, который в каких то случаях наследует большой тяжёлый функционал, а в других — нет.. F>ну или как показал рядом c-smile пример с событиями..
Зачем тогда так сложно?
def getClass(heavy):
if heavy:
class Impl: pass
return Impl
class Impl2: pass
return Impl2;
Здравствуйте, BitField, Вы писали:
F>>ну, иногда может захотеться один класс, который в каких то случаях наследует большой тяжёлый функционал, а в других — нет.. BF>Зачем тогда так сложно? BF>
BF>def getClass(heavy):
BF> if heavy:
BF> class Impl: pass
BF> return Impl
BF> class Impl2: pass
BF> return Impl2;
BF>
а зачем getClass, если можно оставить нормальное имя и подменять в ходе работы?.
Здравствуйте, Manticore, Вы писали:
F>>а зачем getClass, если можно оставить нормальное имя и подменять в ходе работы?. M>Потому что "explicit is better than implicit" (c) The Zen of Python
"явность" — понятие отчасти субъективное..
но ещё хотелось сохранить идентичный синтаксис для двух родственных реализаций..