Конференция "Прочее" » непереопределённые обстрактные методы
 
  • XentaAbsenta © (15.01.09 03:28) [0]
    Скажите, почему делфя позволяет скомпилить прект если не все абстрактные методы переопределены, более того - она даже не матерится на это.
  • Германн © (15.01.09 03:49) [1]

    > XentaAbsenta ©   (15.01.09 03:28)
    >
    > Скажите, почему делфя позволяет скомпилить прект если не
    > все абстрактные методы переопределены, более того - она
    > даже не матерится на это.
    >

    А что в этом плохого?
  • Германн © (15.01.09 03:53) [2]
    В код исполняемой программы попадёт лишь то, что реально вызывается.
  • XentaAbsenta © (15.01.09 04:05) [3]
    плохого в этом то, что я периодически получаю EAbstractError, при том что вместо этого я бы просто не скомпилил проект
  • Котик Б (15.01.09 08:53) [4]
    А вот интересно - если вы периодически получаете AV, обращаясь к нераспределённым объектам - тоже Делфай виновата ?
  • oxffff © (15.01.09 09:07) [5]

    > XentaAbsenta ©   (15.01.09 03:28)  
    > Скажите, почему делфя позволяет скомпилить прект если не
    > все абстрактные методы переопределены, более того - она
    > даже не матерится на это.


    Потому, что в момент компиляции полиморфного вызова тип объекта установить невозможно, из-за ссылочной семантики объекта.
    Если бы этого небыло, тогда проблем было бы гораздо больше.
    Например твой проект определяет контракты (абстрактные классы), подключает внешние реализации(DLL) и вызывает их через контракт базовый абстрактного класса. Если бы этого не было, то такой проект невозможно было бы сделать.
  • Anatoly Podgoretsky © (15.01.09 09:07) [6]
    > XentaAbsenta  (15.01.2009 3:28:00)  [0]

    Потому что они могут быть недоступны на момент компиляции, например в BPL
  • KSergey © (15.01.09 09:10) [7]
    Я вот точно не знаю, но вероятно штука вот в чем.
    В С++ нельзя создать экземпляр класса с заранее неизвестным типом, язык таков. Потому все на уровне компилятора можно отловить.

    В дельфи - можно, через классовую переменную. Потому и нельзя на этапе компиляции в общем случае определить.
    Впрочем, для явного выгова TAbstractClass.Create() вроде можно было бы и добавить compile-magic, но не сделали, видимо некритично.
  • oxffff © (15.01.09 09:13) [8]

    > KSergey ©   (15.01.09 09:10) [7]


    Из-за разной семантики объекта

    SomeClass* a;
    a.SomeAbstractClass();

    НО не

    SomeClass b;
    b.SomeAbstractClass();   <- попытка вызвать у известного типа.
  • KSergey © (15.01.09 09:21) [9]
    > Anatoly Podgoretsky ©   (15.01.09 09:07) [6]
    > Потому что они могут быть недоступны на момент компиляции,  например в BPL

    Я чета недогоняю этот нюанс: декларация же полностью доступна компилятору в любом случае, а в ней все есть.
    Что я непонимаю?
  • KSergey © (15.01.09 09:25) [10]
    > oxffff ©   (15.01.09 09:13) [8]
    > НО не
    >
    > SomeClass b;
    > b.SomeAbstractClass();   <- попытка вызвать у известного типа.

    Можно еще раз, для тупых, плиз
    Я честно не понял семантики используего языка. Это типа С++? Тогда как понять a.SomeAbstractClass() ? Что это за метод? (предупреждаю, с реализацией фабрик на С++ не сталкивался, может от того непонимание)

    Тип уже указан, SomeClass. И экземпляр уже сконструирован. А что за SomeAbstractClass тогда??
  • oxffff © (15.01.09 09:26) [11]

    > KSergey ©   (15.01.09 09:21) [9]


    [8].

    SomeClass* a;
    a.SomeAbstractClass();

    Как компилятор может догадаться, что вызов происходит будет только у абстрактого класса?
  • KSergey © (15.01.09 09:31) [12]
    > oxffff ©   (15.01.09 09:26) [11]
    > SomeClass* a;
    > a.SomeAbstractClass();

    Я никак не могу понять этой записи: создан экземпляр указателя, и вдруг к нему идет обращение через точку, какой-то метод вызывается... Это какой-то smart pointer?
  • KSergey © (15.01.09 09:32) [13]
    хоты нет, это чистый указатель.... не понимаю
  • oxffff © (15.01.09 09:33) [14]

    > KSergey ©   (15.01.09 09:25) [10]
    > Можно еще раз, для тупых, плиз


    Ну не нужно скромничать. :)

    Указателю на экземпляр можно присвоить экземпляр производных типов.

    SomeClass* a;
    a*.SomeAbstractMethod();

    Поэтому установить нарушение можно в случае полного анализа полного потока программы. Что достаточно сложно.
    А для подключаемых DLL с подклассами сделать невозможно.
    Поэтому нарушение установить нельзя.

    В сам экземпляр можно присвоить бинарно только экземпляр идентичного типа.

    SomeClass b;
    b.SomeAbstractMethod();  

    Здесь b может быть только SomeClass.
    Поэтому установить нарушение можно сразу.
  • oxffff © (15.01.09 09:36) [15]

    > oxffff ©   (15.01.09 09:33) [14]


    У Dеlphi случай как раз SomeClass* a;
  • KSergey © (15.01.09 09:42) [16]
    > SomeClass* a;
    > a*.SomeAbstractMethod();

    Так не бывает. Пропущено собственно создание экземпляра объекта (new), как раз там это легко отлавливается в С++.
  • Alkid © (15.01.09 09:46) [17]
    Что-то вас в дебри понесло.
    Вся штука в том, что Дельфи позволяет создавать экземпляры абстрактных классов, когда как C++, C#, Java - нет.
  • Anatoly Podgoretsky © (15.01.09 09:47) [18]
    > KSergey  (15.01.2009 9:21:09)  [9]

    Откуда, да нет этого файла у программиста, он по заказу пишет, а BPL большой секрет.
    Да и про полиморфизм не стоит забывать.
  • Anatoly Podgoretsky © (15.01.09 09:49) [19]
    Сообственно беспокоиться особо не о чем, будет ошибка в ран-тайм. Кроме этого еще много вещей, которые разрешаются в ран-тайм.
 
Конференция "Прочее" » непереопределённые обстрактные методы
Есть новые Нет новых   [134453   +34][b:0][p:0.001]