Возник у нас спор. В дельфи я не особо понимаю. Но вот такой вопрос...
В ООП понятие "виртуальный статический" не имеет смысла. Но TObject.NewInstance объявлен как статический и одновременно виртуальный. Что вообще это значит?
Здравствуйте, Eldar9x, Вы писали:
E>Возник у нас спор. В дельфи я не особо понимаю. Но вот такой вопрос... E>В ООП понятие "виртуальный статический" не имеет смысла. Но TObject.NewInstance объявлен как статический и одновременно виртуальный. Что вообще это значит?
статический это метод который можно вызывать без создания класса. а виртуальный это что его можно перегружать.
и получается что можно этот метод можно перегрузить в предку при этом его вызвать можно будет без создания самого класса.
Здравствуйте, 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;
Здравствуйте, Eldar9x, Вы писали:
E>В ООП понятие "виртуальный статический" не имеет смысла.
Оно "не имеет смысла" при попытка натягивать теорию на физические ограничения C++ и ещё более весёлые "сугубо теоретические и ненужные" ограничения его клонов. Достаточно забыть про плюсы и смотреть в суть, как всё сходится.
E> Но TObject.NewInstance объявлен как статический и одновременно виртуальный. Что вообще это значит?
Ну давайте на конкретном примере. Метод NewInstance — это примерно то же самое, что оператор new в C++/Java.
То, что он "статический" (в кавычках потому как он вовсе не статический, это тупой dismiss терминологии. на самом деле он "метод класса") означает, что его можно и нужно вызывать не для конкретного объекта, а для класса в целом. Что вполне разумно: new SomeObject()
То, что он виртуальный, означает, что его можно переопределить в конкретном классе (аналогично переопределению оператора new), причём это переопределение во-первых, будет унаследовано потомками, а во-вторых, подхвачено при dynamic_cast. То есть
MyObject := FindClass('MyClass').Create; // правильно создаст экземпляр MyClass даже если там переопределён NewInstance
Здравствуйте, Jack128, Вы писали:
J>на самом деле в дельфи классы от объектов отличаются только одним: классы нельзя создавать в run-time. Во всех остальных
Все бы хорошо, но вот это уже слишком сильное утверждение. Класс — это совсем не объект. Хотя бы в силу того, что вы не можете использовать класс вместо объекта или присваивать одни другим. Вы имели в виду не сами классы (в их ООП-понимании), а такое явление, как метакласс — класс, экземпляры которого сами являются классами. То есть метакласс по отношению к классам — примерно то же, что и класс по отношению к объектам, и даже синтаксис выглядит примерно так же (вызов методов, полиморфизм и т.п.) Но это еще не значит, что класс концептуально почти не отличается от объекта
Просто синтаксис Делфи (да и не только Делфи) предпочитает вписывать в определение класса и то, что относится к классу, и то, что относится на самом деле к метаклассу (class function, class var и прочее), и так как "отдельно взятый" метакласс мы не видим — отсюда и ваше странно звучащее утверждение.
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Slicer [Mirkwood], Вы писали:
SM>Здравствуйте, Jack128, Вы писали:
J>>на самом деле в дельфи классы от объектов отличаются только одним: классы нельзя создавать в run-time. Во всех остальных SM>Все бы хорошо, но вот это уже слишком сильное утверждение. Класс — это совсем не объект. Хотя бы в силу того, что вы не можете использовать класс вместо объекта или присваивать одни другим.
Классовые ссылки я могу присваивать классовым ссылкам. Объектные — объектным. Мешать друг с другом — нет, конечно не могу.