Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить.
Меня в Delphi очень злит отсутствие статических классов. Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию: например у меня есть запись TVector, с тремя компонентами tvector.x, tvector.y, tvector.z, и нужна функция tvector.length. Я одно время пробовал создавать функции со сложными именами, например function tvector_length(var obj:tvector), но как-то это не пошло. Создавать класс tvector — не вариант, поскольку будет тормозить и придётся каждый раз инициализировать и уничтожать этот класс. У record-ов со встроенными функциями были бы две базовые характеристики классов – инкапсуляция и наследования, а уж полиморфизм нужен далеко не всегда.
Вот у меня вопрос, насколько всё это решено в более современных ЯП?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить. K>Меня в Delphi очень злит отсутствие статических классов. Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию: например у меня есть запись TVector, с тремя компонентами tvector.x, tvector.y, tvector.z, и нужна функция tvector.length. Я одно время пробовал создавать функции со сложными именами, например function tvector_length(var obj:tvector), но как-то это не пошло. Создавать класс tvector — не вариант, поскольку будет тормозить и придётся каждый раз инициализировать и уничтожать этот класс. У record-ов со встроенными функциями были бы две базовые характеристики классов – инкапсуляция и наследования, а уж полиморфизм нужен далеко не всегда. K>Вот у меня вопрос, насколько всё это решено в более современных ЯП?
не совсем понял суть проблемы
интересует добавление своих функций к уже имеющимся типам?
в с++, для этого есть ADL:
namespace test {
struct vector {
float x,y,z;
};
float length ( vector const & );
}
int main () {
test::vector v;
float d = length( v );
return 0;
}
K>Меня в Delphi очень злит отсутствие статических классов.
Статические классы — это костыль, появившийся из-за отсутствия нормальных модулей.
Вот в Компонентном паскале есть нормальные модули, поэтому и статические классы не нужны.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Khimik, Вы писали:
K>Вот у меня вопрос, насколько всё это решено в более современных ЯП?
Не совсем понятно, почему ты называешь искомое статическим классом.
Насколько я помню, в дельфях рекорды — это POD структуры, без методов, конструкторов/деструкторов и тп, что есть у объектов. Тут тебе не хватает методов. А у класса тебя раздражает необходимость вызывать конструктор/деструктор для такого record-style класса?
Мой тебе совет — отнеси дельфи на помоечку. В C++ конструктор/деструктор вызывается автоматом, не надо ручками вызывать (боже, кто вообще такое убожество придумал?), и в общем случае дефолтные даже не надо самому писать, компилятор генерит. И структура от класса отличается только режимом доступа к членам по умолчанию.
struct TVector{
int x, y, z;
int length() { int res; /* do something */return res; }
};
struct TVector v;
v.length();
Если прирос к дельфевым компонентам, используй C++ Builder
Здравствуйте, Khimik, Вы писали:
K>Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить. K>Меня в Delphi очень злит отсутствие статических классов. Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию: например у меня есть запись TVector, с тремя компонентами tvector.x, tvector.y, tvector.z, и нужна функция tvector.length. Я одно время пробовал создавать функции со сложными именами, например function tvector_length(var obj:tvector), но как-то это не пошло. Создавать класс tvector — не вариант, поскольку будет тормозить и придётся каждый раз инициализировать и уничтожать этот класс. У record-ов со встроенными функциями были бы две базовые характеристики классов – инкапсуляция и наследования, а уж полиморфизм нужен далеко не всегда. K>Вот у меня вопрос, насколько всё это решено в более современных ЯП?
вообще то в дельфи уже лет 6 как есть методы для рекордов.
Здравствуйте, Khimik, Вы писали:
K>Может быть я вас не понял, но по-моему не оно.
K>Фунцию vector(vect:tvector) написать можно, но удобнее было бы вызывать её через точку (d:=v.length), иначе можно запутаться если этих функций много.
добавить в уже существующий класс новый метод?
не, такого в плюсах нет.
только через обертку или наследника:
Здравствуйте, Khimik, Вы писали:
K>Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить. K>Меня в Delphi очень злит отсутствие статических классов. K>Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию: например у меня есть запись TVector, с тремя компонентами tvector.x, tvector.y, tvector.z, и нужна функция tvector.length. Я одно время пробовал создавать функции со сложными именами, например function tvector_length(var obj:tvector), но как-то это не пошло. Создавать класс tvector — не вариант, поскольку будет тормозить и придётся каждый раз инициализировать и уничтожать этот класс. У record-ов со встроенными функциями были бы две базовые характеристики классов – инкапсуляция и наследования, а уж полиморфизм нужен далеко не всегда.
Тип Object запретили?
type
TMyClass = class
public
procedure StoreName(name : string);
end;
TProc = procedure(name : string) of object;
var
proc : TProc;
myClass : TMyClass;
begin
myClass := TMyClass.Create;
proc := myClass.StoreName;
proc('My name'); // Вызывает myClass.StoreNameend;
Здравствуйте, Khimik, Вы писали:
K>Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить. K>Меня в Delphi очень злит отсутствие статических классов. Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию:
[code=pas]
type vector = object
...
[/code]
Это прикол, оставшийся со времён Борланд Паскаля, но он вроде делает то, что тебе надо.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>Здравствуйте, Khimik, Вы писали:
K>>Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить. K>>Меня в Delphi очень злит отсутствие статических классов. Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию:
TB>[code=pas] TB>type vector = object TB>... TB>[/code] TB>Это прикол, оставшийся со времён Борланд Паскаля, но он вроде делает то, что тебе надо.
Здравствуйте, Khimik, Вы писали:
K>Здравствуйте, T4r4sB, Вы писали:
TB>>Здравствуйте, Khimik, Вы писали:
K>>>Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить. K>>>Меня в Delphi очень злит отсутствие статических классов. Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию:
TB>>[code=pas] TB>>type vector = object TB>>... TB>>[/code] TB>>Это прикол, оставшийся со времён Борланд Паскаля, но он вроде делает то, что тебе надо.
K>Что-то не то вы пишете, в этом
Здравствуйте, Khimik, Вы писали:
K>Фунцию vector(vect:tvector) написать можно, но удобнее было бы вызывать её через точку (d:=v.length), иначе можно запутаться если этих функций много.
C#, extension methods, очень удобно с синтаксической точки зрения
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, Khimik, Вы писали:
K>>Может быть я вас не понял, но по-моему не оно.
K>>Фунцию vector(vect:tvector) написать можно, но удобнее было бы вызывать её через точку (d:=v.length), иначе можно запутаться если этих функций много.
NB>добавить в уже существующий класс новый метод? NB>не, такого в плюсах нет. NB>только через обертку или наследника: NB>