четверг, 4 декабря 2014 г.

Generic'и в Delphi и шаблоны в C++. Коротко. Напишу грубость

Несмотря на то, что я не сторонник холиваров - напишу "грубость".

Почему?

Какая мотивация?

Ну потому, что "киты" типа 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'и - не нужны.

Достаточно обычного класса, который использует интерфейсы. Ну или абстрактный класс.

Но шаблоны (или 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

4 комментария: