Несмотря на то, что я не сторонник холиваров - напишу "грубость".
Почему?
Какая мотивация?
Ну потому, что "киты" типа Embarcadero - должны осознавать ответственность, когда "что-то придумывают", а тем более когда гонятся за "кем-то типа C++".
А если уж "придумывают", то ДОЛЖНЫ доносить идею, до "широких масс".
Итак.
Речь пойдёт про Generic'и Delphi vs. шаблоны (template) C++.
Generic'и конечноущербные удивляют. Слов нету.
Сравним:
C++
- работает ибо X<A> - инстанцируется по месту использования.
И вызываемые методы - тоже.
Delphi
- не работает. Ибо toString пытается компилироваться в Generic'е.
А не по месту инстанцирования Generic'а.
Зато работает так:
Но этобред странный подход конечно, а не "обобщение".
Про X<T: ISomeInterface> - я конечно же знаю. Но это -бред "масло масляное". На мой вкус. Ибо при использовании интерфейсов и Generic'и - не нужны.
Достаточно обычного класса, который использует интерфейсы. Ну или абстрактный класс.
Но шаблоны (или Generic'и) на то и нужны чтобы не плодить интерфейсы или абстрактные классы.
А "примеси" - такое могут:
http://18delphi.blogspot.ru/2013/03/blog-post_29.html
http://18delphi.blogspot.ru/2013/03/blog-post_8379.html
http://18delphi.blogspot.ru/2013/07/2.html
Не говоря уж о конструкции:
- Generic'и конечно такое не могут, а "примеси" - могут.
Связанная тема - Ссылки. Концепции в C++
И ещё - Дженерики: ограничение «constructor»
И ещё - Про "примеси", шаблоны и Generic'и
Ну и "как делать правильно" - Про "примеси", шаблоны и Generic'и №3
Почему?
Какая мотивация?
Ну потому, что "киты" типа Embarcadero - должны осознавать ответственность, когда "что-то придумывают", а тем более когда гонятся за "кем-то типа C++".
А если уж "придумывают", то ДОЛЖНЫ доносить идею, до "широких масс".
Итак.
Речь пойдёт про Generic'и Delphi vs. шаблоны (template) C++.
Generic'и конечно
Сравним:
C++
template<class T> class X { private: T member; public: std::string toString () const { return member.toString(); } }; class A { public: std::string toString () const { return "Hello world"; } }; X<A> inst; inst.toString();
- работает ибо X<A> - инстанцируется по месту использования.
И вызываемые методы - тоже.
Delphi
type X<T : class> = class private member : T; public function toString: String; end;//X<T : class> ... fuction X<T>.toString: String; begin Result := member.toString; // UNKNOWN Identifier toString; end;
- не работает. Ибо toString пытается компилироваться в Generic'е.
А не по месту инстанцирования Generic'а.
Зато работает так:
type X<T : class> = class private member : T; public function toString: String; end;//X<T : class> ... type TToString = class abstract public function toString(): String; virtual; abstract; end;//TToString fuction X<T>.toString: String; begin Result := (member As TToString).toString; end;
Но это
Про X<T: ISomeInterface> - я конечно же знаю. Но это -
Достаточно обычного класса, который использует интерфейсы. Ну или абстрактный класс.
Но шаблоны (или Generic'и) на то и нужны чтобы не плодить интерфейсы или абстрактные классы.
А "примеси" - такое могут:
http://18delphi.blogspot.ru/2013/03/blog-post_29.html
http://18delphi.blogspot.ru/2013/03/blog-post_8379.html
http://18delphi.blogspot.ru/2013/07/2.html
Не говоря уж о конструкции:
type X<T : class> = class(T)
- Generic'и конечно такое не могут, а "примеси" - могут.
Связанная тема - Ссылки. Концепции в C++
И ещё - Дженерики: ограничение «constructor»
И ещё - Про "примеси", шаблоны и Generic'и
Ну и "как делать правильно" - Про "примеси", шаблоны и Generic'и №3
Недопилили...
ОтветитьУдалитьСкорее - "даже не подумали".
Удалить> гонятся за "кем-то типа C++"
ОтветитьУдалитьГнались за C#, отсюда и такие Generic'и.
Возможно. Не возьмусь судить. Я не большой специалист в C#.
Удалить