-
Скажите, почему делфя позволяет скомпилить прект если не все абстрактные методы переопределены, более того - она даже не матерится на это.
-
> XentaAbsenta © (15.01.09 03:28)
>
> Скажите, почему делфя позволяет скомпилить прект если не
> все абстрактные методы переопределены, более того - она
> даже не матерится на это.
>
А что в этом плохого?
-
В код исполняемой программы попадёт лишь то, что реально вызывается.
-
плохого в этом то, что я периодически получаю EAbstractError, при том что вместо этого я бы просто не скомпилил проект
-
А вот интересно - если вы периодически получаете AV, обращаясь к нераспределённым объектам - тоже Делфай виновата ?
-
> XentaAbsenta © (15.01.09 03:28)
> Скажите, почему делфя позволяет скомпилить прект если не
> все абстрактные методы переопределены, более того - она
> даже не матерится на это.
Потому, что в момент компиляции полиморфного вызова тип объекта установить невозможно, из-за ссылочной семантики объекта.
Если бы этого небыло, тогда проблем было бы гораздо больше.
Например твой проект определяет контракты (абстрактные классы), подключает внешние реализации(DLL) и вызывает их через контракт базовый абстрактного класса. Если бы этого не было, то такой проект невозможно было бы сделать.
-
> XentaAbsenta (15.01.2009 3:28:00) [0]
Потому что они могут быть недоступны на момент компиляции, например в BPL
-
Я вот точно не знаю, но вероятно штука вот в чем.
В С++ нельзя создать экземпляр класса с заранее неизвестным типом, язык таков. Потому все на уровне компилятора можно отловить.
В дельфи - можно, через классовую переменную. Потому и нельзя на этапе компиляции в общем случае определить.
Впрочем, для явного выгова TAbstractClass.Create() вроде можно было бы и добавить compile-magic, но не сделали, видимо некритично.
-
> KSergey © (15.01.09 09:10) [7]
Из-за разной семантики объекта
SomeClass* a;
a.SomeAbstractClass();
НО не
SomeClass b;
b.SomeAbstractClass(); <- попытка вызвать у известного типа.
-
> Anatoly Podgoretsky © (15.01.09 09:07) [6]
> Потому что они могут быть недоступны на момент компиляции, например в BPL
Я чета недогоняю этот нюанс: декларация же полностью доступна компилятору в любом случае, а в ней все есть.
Что я непонимаю?
-
> oxffff © (15.01.09 09:13) [8]
> НО не
>
> SomeClass b;
> b.SomeAbstractClass(); <- попытка вызвать у известного типа.
Можно еще раз, для тупых, плиз
Я честно не понял семантики используего языка. Это типа С++? Тогда как понять a.SomeAbstractClass() ? Что это за метод? (предупреждаю, с реализацией фабрик на С++ не сталкивался, может от того непонимание)
Тип уже указан, SomeClass. И экземпляр уже сконструирован. А что за SomeAbstractClass тогда??
-
> KSergey © (15.01.09 09:21) [9]
[8].
SomeClass* a;
a.SomeAbstractClass();
Как компилятор может догадаться, что вызов происходит будет только у абстрактого класса?
-
> oxffff © (15.01.09 09:26) [11]
> SomeClass* a;
> a.SomeAbstractClass();
Я никак не могу понять этой записи: создан экземпляр указателя, и вдруг к нему идет обращение через точку, какой-то метод вызывается... Это какой-то smart pointer?
-
хоты нет, это чистый указатель.... не понимаю
-
> KSergey © (15.01.09 09:25) [10]
> Можно еще раз, для тупых, плиз
Ну не нужно скромничать. :)
Указателю на экземпляр можно присвоить экземпляр производных типов.
SomeClass* a;
a*.SomeAbstractMethod();
Поэтому установить нарушение можно в случае полного анализа полного потока программы. Что достаточно сложно.
А для подключаемых DLL с подклассами сделать невозможно.
Поэтому нарушение установить нельзя.
В сам экземпляр можно присвоить бинарно только экземпляр идентичного типа.
SomeClass b;
b.SomeAbstractMethod();
Здесь b может быть только SomeClass.
Поэтому установить нарушение можно сразу.
-
> oxffff © (15.01.09 09:33) [14]
У Dеlphi случай как раз SomeClass* a;
-
> SomeClass* a;
> a*.SomeAbstractMethod();
Так не бывает. Пропущено собственно создание экземпляра объекта (new), как раз там это легко отлавливается в С++.
-
Что-то вас в дебри понесло.
Вся штука в том, что Дельфи позволяет создавать экземпляры абстрактных классов, когда как C++, C#, Java - нет.
-
> KSergey (15.01.2009 9:21:09) [9]
Откуда, да нет этого файла у программиста, он по заказу пишет, а BPL большой секрет.
Да и про полиморфизм не стоит забывать.
-
Сообственно беспокоиться особо не о чем, будет ошибка в ран-тайм. Кроме этого еще много вещей, которые разрешаются в ран-тайм.