Динамическая типизация [re: А какие технологии сейчас модные?]
нормальную динамическую типизацию
что это? можно объяснить для непосвященных на пальцах
При этом экземпляр остается тем же самым, но у объекта меняется тип.
ps
Под типом понимается совокупность поддерживаемых интерфейсов, методов и т.д.
это не ограничивается приведением типа?
Вопрос не понял. Переформулируй его чуть-чуть по другому, пожалуйста.
a=(Type2)b;
? (или вообще a=b; в зависимости от того, кто от кого отнаследован)
Иногда хочется, вообще, ничего не добавлять, а просто уметь выполнить или не выполнить любой внешний запрос (как на приведение к определенному типу, так и на вызов метода с определенной сигнатурой).
ps
Но после того, как преобразовались к определенному типу надо же еще выполнять каждый из методов, если мы их не умеем выполнять в общем виде, то придется генерить налету все методы target-типа, а это уже тоже геморрой.
Возможно, то, что я сейчас скажу - глупость, но разве это делается не при помощи Map и какой-то матери?
зы
Напиши, например, с помощью Map адаптер на типизированную коллекцию , адаптер например должен отфильтровывать все отрицательные элементы
Это когда в языке есть объекты, которые можно менять по ходу работы, т.е. добавлять/удалять интерфейсы, методы, поля и т.д.
При этом экземпляр остается тем же самым, но у объекта меняется тип.
Какая-то очень странная фича, зачем это нужно?
В JDK 1.5 кстати гораздо более интересная возможность - bytecode transformation.
Большая часть таких генераторов - генерят код для всяких разных адаптеров (адаптер к базе, адаптер к сохранению/Загрузке, адаптер к web-сервису и т.д.)
Все эти адаптеры пишутся в пару строчек, если есть возможность динамически обслуживать внешние запросы.
ps
"bytecode transformation" - нацелен на оптимизацию быстродействия работы программы, а не на ускорение написания программ.
Адаптер или прокси? Динамические прокси в Java существуют уже года 3. Что касается адаптеров, то для них есть такая штука как CGLIB. Bytecode transformation - это именно CGLIB на уровне JDK.
Разница между адаптером и прокси чисто логическая.
Единственная разница - Адаптер - адаптирует прикладной функционал, а прокси - системный функционал (например, поддерживая какой-либо транспорт).
> Динамические прокси в Java существуют уже года 3
Они не динамические, они скорее просто runtime-овые - но это не интересно, это можно сделать и руками.
Единственная разница - Адаптер - адаптирует прикладной функционал, а прокси - системный функционал (например, поддерживая какой-либо транспорт).huh? это принципиально разные вещи
> Динамические прокси в Java существуют уже года 3В runtime хрен что руками сделаешь.
Они не динамические, они скорее просто runtime-овые - но это не интересно, это можно сделать и руками.
И что же в ниже указанном коде такого разного?
Код для прокси:
class UserProxy: IUser
{
public string GetName
{
return Transport.GetString;
}
}
Код для адаптера:
class UserAdapter: IUser
{
public string GetName
{
return Какой-тоДругойUser.GetName;
}
}
> В runtime хрен что руками сделаешь.
Генерить текстовые файлы Java умеет.
Компилировать текстовые файлы тоже умеет
Загружать скомпилированные сборки тоже умеет
Все это вместе позволяет генерить в runtime-е все что угодно.
Поэтому я не понял твое высказывание.
Все это вместе позволяет генерить в runtime-е все что угодно.
В том числе и то, чего тебе изначально хотелось типа самомодифирующихся классов
В честь чего это они перепутаны?
Все это вместе позволяет генерить в runtime-е все что угодно.
> В том числе и то, чего тебе изначально хотелось типа самомодифирующихся классов
И как? Тип уже созданного экземпляра же менять нельзя....
а можно про bytecode transformation подробнее
Это новый пакет java.lang.instrumentation. Фактически позволяет создавать нечто вроде плагинов (ClassFileTransformer) к любым ClassLoader-ам, т.е. при загрузке класса можно его каким-то хитрым образом поменять. Что сильно упрощает использование таких библиотек как CGLIB.
Ясное дело, это же не Smalltalk. Но это решается, например, агрегацией.
прикольно
Да, можно, но только придется тогда придумывать свою конструкцию приведения типов и полностью неиспользовать стандартые приведения типов.
CComQIPtr<IUnknown> p;
CComQIPtr<IStorage> q = p; // вызывается QueryInterface
еще один + в пользу VC++ 2005
Это можно и на Generic-ах сделать.
Я восхищаюсь возможностями связки .Net+C++, но меня просто в дрожь бросает, когда я вспоминаю, что C++ является однопроходным (может быть двухпроходным) языком....
по крайней мере в C#, там операторы статические, а с ним дженерики не работают
хотя может с помощью конструкторов
можно думаю в С++ если сделать вируальный оперетор приведения (хотя не уверен, что можно в ref class иметь виртуальные опереаторы)
public class Cast
{
public static T From<T>(IServiceProvider provider)
{
return (T)provider.GetService(typeof(T;
}
}
void main
{
IA2 a2 = Cast<IA2>.From(a1);
}
Зачем в .Net-е заводить такой класс, как CComQIPtr?
там smart указатели
ptr<IA1> a1 = ....
ptr<IA2> a2 = ....
...
a2 = a1; // конвертация, здесь даже не нужно знать как конветрить
А маза в том, что иногда хочется полной свободы во время runtime-а.
Оставить комментарий
Dasar
> Т.е. если микроскопом не забивать гвоздей, а использовать все по назначению, то джава удобней.С этим - полностью согласен.
ps
Но вот в Java-е часто хочется иметь нормальную динамическую типизацию - при написании всяких проксей, адаптеров и т.д. Сейчас обычно это решается, через написание большого числа генераторов кода.