Несмотря на то, что я не сторонник холиваров - напишу "грубость".
Почему?
Какая мотивация?
Ну потому, что "киты" типа 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#.
Удалить