TObject.NewInstance
От: Eldar9x  
Дата: 16.12.11 07:46
Оценка:
Возник у нас спор. В дельфи я не особо понимаю. Но вот такой вопрос...
В ООП понятие "виртуальный статический" не имеет смысла. Но TObject.NewInstance объявлен как статический и одновременно виртуальный. Что вообще это значит?
int i;
i = (i++)+(i++);
cout << i;
Re: TObject.NewInstance
От: ViktorXP Украина  
Дата: 16.12.11 09:06
Оценка:
Здравствуйте, Eldar9x, Вы писали:

E>Возник у нас спор. В дельфи я не особо понимаю. Но вот такой вопрос...

E>В ООП понятие "виртуальный статический" не имеет смысла. Но TObject.NewInstance объявлен как статический и одновременно виртуальный. Что вообще это значит?

статический это метод который можно вызывать без создания класса. а виртуальный это что его можно перегружать.
и получается что можно этот метод можно перегрузить в предку при этом его вызвать можно будет без создания самого класса.
Re: TObject.NewInstance
От: Jack128  
Дата: 16.12.11 09:31
Оценка: 2 (1)
Здравствуйте, Eldar9x, Вы писали:

E>Возник у нас спор. В дельфи я не особо понимаю. Но вот такой вопрос...

E>В ООП понятие "виртуальный статический" не имеет смысла.
В ООП вобщем то и понятия "виртуальный" нету. Виртуальный метод — это лишь способ реализации полиморфизма. В статически типизированных ООП языках самый популярный, но вообще говоря — не единственно возможный.

E>Но TObject.NewInstance объявлен как статический и одновременно виртуальный. Что вообще это значит?


не статический, а классовый. Статический метод в дельфи — это тоже самое что и статический метод в Си подобных языках. То есть обычная функция, которая использует класс в качестве namespace'а.

А вот классовый метод — похож на instance метод, в том плане, что ему так же неявно передается дополнительный параметр. только отличии от экземплярного метода — это будет не объект, а класс.
Технически такое значение — это указатель на VMT класса. А раз у на есть VMT, то мы можем вызвать полиморфный метод.

на самом деле в дельфи классы от объектов отличаются только одним: классы нельзя создавать в run-time. Во всех остальных аспектах — они одинаковы.


TBase = class
protected
  class procedure DoWork(); virtual; abstract;
public
  class procedure Work(); // DoWrok();
end;
TChild1 = class
protected
  class procedure DoWork(); override; // ShowMessage('child1')
end;
TChild2 = class
protected
  class procedure DoWork(); override; // ShowMessage('child2')
end;


var
 X: class of TBase; // x - классовая ссылка. На низком уровне - фактически указатель на VMT класса
begin
  if random(1) = 0 then x := TChild1 else x := TChild2;
  x.Work();
end;
Re: TObject.NewInstance
От: Softwarer http://softwarer.ru
Дата: 19.12.11 12:59
Оценка:
Здравствуйте, Eldar9x, Вы писали:

E>В ООП понятие "виртуальный статический" не имеет смысла.


Оно "не имеет смысла" при попытка натягивать теорию на физические ограничения C++ и ещё более весёлые "сугубо теоретические и ненужные" ограничения его клонов. Достаточно забыть про плюсы и смотреть в суть, как всё сходится.

E> Но TObject.NewInstance объявлен как статический и одновременно виртуальный. Что вообще это значит?


Ну давайте на конкретном примере. Метод NewInstance — это примерно то же самое, что оператор new в C++/Java.

То, что он "статический" (в кавычках потому как он вовсе не статический, это тупой dismiss терминологии. на самом деле он "метод класса") означает, что его можно и нужно вызывать не для конкретного объекта, а для класса в целом. Что вполне разумно: new SomeObject()

То, что он виртуальный, означает, что его можно переопределить в конкретном классе (аналогично переопределению оператора new), причём это переопределение во-первых, будет унаследовано потомками, а во-вторых, подхвачено при dynamic_cast. То есть

MyObject := FindClass('MyClass').Create; // правильно создаст экземпляр MyClass даже если там переопределён NewInstance
Re[2]: TObject.NewInstance
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 25.12.11 19:52
Оценка:
Здравствуйте, Jack128, Вы писали:

J>на самом деле в дельфи классы от объектов отличаются только одним: классы нельзя создавать в run-time. Во всех остальных

Все бы хорошо, но вот это уже слишком сильное утверждение. Класс — это совсем не объект. Хотя бы в силу того, что вы не можете использовать класс вместо объекта или присваивать одни другим. Вы имели в виду не сами классы (в их ООП-понимании), а такое явление, как метакласс — класс, экземпляры которого сами являются классами. То есть метакласс по отношению к классам — примерно то же, что и класс по отношению к объектам, и даже синтаксис выглядит примерно так же (вызов методов, полиморфизм и т.п.) Но это еще не значит, что класс концептуально почти не отличается от объекта
Просто синтаксис Делфи (да и не только Делфи) предпочитает вписывать в определение класса и то, что относится к классу, и то, что относится на самом деле к метаклассу (class function, class var и прочее), и так как "отдельно взятый" метакласс мы не видим — отсюда и ваше странно звучащее утверждение.

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[3]: TObject.NewInstance
От: Jack128  
Дата: 26.12.11 09:03
Оценка:
Здравствуйте, Slicer [Mirkwood], Вы писали:

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


J>>на самом деле в дельфи классы от объектов отличаются только одним: классы нельзя создавать в run-time. Во всех остальных

SM>Все бы хорошо, но вот это уже слишком сильное утверждение. Класс — это совсем не объект. Хотя бы в силу того, что вы не можете использовать класс вместо объекта или присваивать одни другим.

Классовые ссылки я могу присваивать классовым ссылкам. Объектные — объектным. Мешать друг с другом — нет, конечно не могу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.