Статические классы
От: Khimik  
Дата: 20.11.15 05:15
Оценка:
Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить.
Меня в Delphi очень злит отсутствие статических классов. Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию: например у меня есть запись TVector, с тремя компонентами tvector.x, tvector.y, tvector.z, и нужна функция tvector.length. Я одно время пробовал создавать функции со сложными именами, например function tvector_length(var obj:tvector), но как-то это не пошло. Создавать класс tvector — не вариант, поскольку будет тормозить и придётся каждый раз инициализировать и уничтожать этот класс. У record-ов со встроенными функциями были бы две базовые характеристики классов – инкапсуляция и наследования, а уж полиморфизм нужен далеко не всегда.
Вот у меня вопрос, насколько всё это решено в более современных ЯП?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Статические классы
От: night beast СССР  
Дата: 20.11.15 05:36
Оценка:
Здравствуйте, 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;
}


оно?
Re[2]: Статические классы
От: Khimik  
Дата: 20.11.15 05:42
Оценка:
Здравствуйте, night beast, Вы писали:


NB>не совсем понял суть проблемы

NB>интересует добавление своих функций к уже имеющимся типам?
NB>в с++, для этого есть ADL:
NB>
NB>namespace test {
NB>struct vector {
NB>  float x,y,z;
NB>};

NB>float length ( vector const & );

NB>}

NB>int main () {
NB>   test::vector v;
NB>   float d = length( v );
NB>   return 0;
NB>}
NB>


NB>оно?


Может быть я вас не понял, но по-моему не оно.

Фунцию vector(vect:tvector) написать можно, но удобнее было бы вызывать её через точку (d:=v.length), иначе можно запутаться если этих функций много.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Статические классы
От: LaptevVV Россия  
Дата: 20.11.15 06:27
Оценка: -1
K>Меня в Delphi очень злит отсутствие статических классов.
Статические классы — это костыль, появившийся из-за отсутствия нормальных модулей.
Вот в Компонентном паскале есть нормальные модули, поэтому и статические классы не нужны.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Статические классы
От: утпутуук  
Дата: 20.11.15 06:48
Оценка:
Здравствуйте, 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
Re: Статические классы
От: Jack128  
Дата: 20.11.15 06:49
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить.

K>Меня в Delphi очень злит отсутствие статических классов. Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию: например у меня есть запись TVector, с тремя компонентами tvector.x, tvector.y, tvector.z, и нужна функция tvector.length. Я одно время пробовал создавать функции со сложными именами, например function tvector_length(var obj:tvector), но как-то это не пошло. Создавать класс tvector — не вариант, поскольку будет тормозить и придётся каждый раз инициализировать и уничтожать этот класс. У record-ов со встроенными функциями были бы две базовые характеристики классов – инкапсуляция и наследования, а уж полиморфизм нужен далеко не всегда.
K>Вот у меня вопрос, насколько всё это решено в более современных ЯП?

вообще то в дельфи уже лет 6 как есть методы для рекордов.
Re[2]: Статические классы
От: Jack128  
Дата: 20.11.15 06:51
Оценка:
Здравствуйте, Jack128, Вы писали:

J>вообще то в дельфи уже лет 6 как есть методы для рекордов.


если изменять сам рекорд нельзя, то можно record helper'ами воспользоваться.
Re[2]: Статические классы
От: Khimik  
Дата: 20.11.15 06:58
Оценка:
Здравствуйте, Jack128, Вы писали:

J>вообще то в дельфи уже лет 6 как есть методы для рекордов.


Поясните?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[3]: Статические классы
От: Jack128  
Дата: 20.11.15 09:29
Оценка: 6 (2)
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, Jack128, Вы писали:


J>>вообще то в дельфи уже лет 6 как есть методы для рекордов.


K>Поясните?


http://docwiki.embarcadero.com/RADStudio/Seattle/en/Structured_Types#Records_.28advanced.29
Re[3]: Статические классы
От: night beast СССР  
Дата: 20.11.15 13:23
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Может быть я вас не понял, но по-моему не оно.


K>Фунцию vector(vect:tvector) написать можно, но удобнее было бы вызывать её через точку (d:=v.length), иначе можно запутаться если этих функций много.


добавить в уже существующий класс новый метод?
не, такого в плюсах нет.
только через обертку или наследника:
struct vector {
   float x,y,z;
};

struct vector_view {
   vector const & m_ref;
   vector_view ( vector const & src ) : m_ref( src ) { }
   operator vector const & ( ) const { return m_ref; }
   float length ( ) const;
};

void test ( vector const & );

int main () {
   vector v;
   vector_view vv( vv );
   test( vv );
}


накладных расходов быть не должно. компиляторы нынче умные.

а насчет много -- это для разных метрик что-ли?
Отредактировано 20.11.2015 13:31 night beast . Предыдущая версия .
Re: Статические классы
От: iZEN СССР  
Дата: 20.11.15 17:25
Оценка:
Здравствуйте, 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.StoreName
end;
Re: Статические классы
От: Pavel Dvorkin Россия  
Дата: 22.11.15 09:12
Оценка:
Здравствуйте, Khimik, Вы писали:

Все это в Delphi есть, но устарело. Это можель, оставшаяся в наследство от Turbo Pascal

https://ru.wikipedia.org/wiki/Object_Pascal

См. там

Изменения синтаксиса, из-за изменения размещения объектов — Объектная модель в Turbo Pascal:
With best regards
Pavel Dvorkin
Re: Статические классы
От: T4r4sB Россия  
Дата: 22.11.15 12:15
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить.

K>Меня в Delphi очень злит отсутствие статических классов. Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию:

[code=pas]
type vector = object
...
[/code]
Это прикол, оставшийся со времён Борланд Паскаля, но он вроде делает то, что тебе надо.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: Статические классы
От: Khimik  
Дата: 22.11.15 14:28
Оценка: -1
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, Khimik, Вы писали:


K>>Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить.

K>>Меня в Delphi очень злит отсутствие статических классов. Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию:

TB>[code=pas]

TB>type vector = object
TB>...
TB>[/code]
TB>Это прикол, оставшийся со времён Борланд Паскаля, но он вроде делает то, что тебе надо.

Что-то не то вы пишете, в этом
Автор: Jack128
Дата: 20.11.15
посте было что надо.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[3]: Статические классы
От: T4r4sB Россия  
Дата: 22.11.15 15:47
Оценка: +1
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, T4r4sB, Вы писали:


TB>>Здравствуйте, Khimik, Вы писали:


K>>>Я скорее непрофессиональный программист, отстал от жизни, поэтому хочу спросить.

K>>>Меня в Delphi очень злит отсутствие статических классов. Т.е. часто нужна простая запись (record) с возможностью вызвать свою функцию:

TB>>[code=pas]

TB>>type vector = object
TB>>...
TB>>[/code]
TB>>Это прикол, оставшийся со времён Борланд Паскаля, но он вроде делает то, что тебе надо.

K>Что-то не то вы пишете, в этом
Автор: Jack128
Дата: 20.11.15
посте было что надо.


То, что я пишу, тоже работает, причём и во всяком старье типа Дельфи-7.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[3]: Статические классы
От: Mr.Delphist  
Дата: 03.12.15 09:20
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Фунцию vector(vect:tvector) написать можно, но удобнее было бы вызывать её через точку (d:=v.length), иначе можно запутаться если этих функций много.


C#, extension methods, очень удобно с синтаксической точки зрения
Re[3]: Статические классы
От: x-code  
Дата: 10.12.15 07:47
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Что-то не то вы пишете, в этом
Автор: Jack128
Дата: 20.11.15
посте было что надо.


Просто это не называется "статические классы". Это обычные (в терминах С++) классы без механизмов позднего связывания, всего-то навсего.
Re[4]: Статические классы
От: macaronian  
Дата: 14.12.15 19:12
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, Khimik, Вы писали:


K>>Может быть я вас не понял, но по-моему не оно.


K>>Фунцию vector(vect:tvector) написать можно, но удобнее было бы вызывать её через точку (d:=v.length), иначе можно запутаться если этих функций много.


NB>добавить в уже существующий класс новый метод?

NB>не, такого в плюсах нет.
NB>только через обертку или наследника:
NB>
NB>struct vector {
NB>   float x,y,z;
NB>};

NB>struct vector_view {
NB>   vector const & m_ref;
NB>   vector_view ( vector const & src ) : m_ref( src ) { }
NB>   operator vector const & ( ) const { return m_ref; }
NB>   float length ( ) const;
NB>};

NB>void test ( vector const & );

NB>int main () {
NB>   vector v;
NB>   vector_view vv( vv );
NB>   test( vv );
NB>}
NB>



>>>operator vector const & ( ) const { return m_ref; } — пипец борщ. в топку.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.