Имя: Пароль:
IT
 
Delphi class abstract (версия Delphi XE7)
0 Ненавижу 1С
 
гуру
12.11.14
08:36
Описываю класс как абстрактный

type
  MDObject=class abstract
  end;

однако его экземпляры все равно можно создавать

var
  x:MDObject;
begin
  x:=MDObject.Create;
  x.Free;
end

вопрос, а в чем тогда смысл этой инструкции?
1 Serginio1
 
12.11.14
10:39
А варнинги при компиляции есть?
2 vde69
 
12.11.14
10:45
на сколько помню, это именно для того и сделано, что-бы не выдавало ошибку....

абстрактный класс служит некой "болванкой" для шилдов. В твоем примере MDObject = TObject
3 Кирпич
 
12.11.14
10:45
а почему мы решили что создавать экземпляры абстрактных классов запрещено?
4 Looser-1c
 
12.11.14
10:46
(3) По определению абстрактного класса....
5 Кирпич
 
12.11.14
10:46
по идее, должно ругаться при обращении к абстрактному методу. добавь в класс метод. может заругается.
6 18_plus
 
12.11.14
10:48
гуглозабаненные все
"В одних языках создавать экземпляры абстрактных классов запрещено, в других это допускается (например, ObjectPascal(Delphi)), но обращение к абстрактному методу объекта этого класса в процессе выполнения программы приведёт к ошибке."
7 Кирпич
 
12.11.14
10:48
(4) ну смотря кто их придумывал. в одних языках так, в других по другому.
8 vde69
 
12.11.14
10:50
пример использования

описываем абстракный класс TCustomMuClass со свойством P1

потом на его основании описываем 2 разных класса TMuClass1 и TMuClass2 в них переопределяем P1 каждый на свой...

потом гдето (например в TList) хотим использовать поле заранее не зная какой класс, тогда там описываем items как объект TCustomMuClass а фактически помещаем туда то что надо из своих двух классов. То есть используем типизированый указатель на родителя....
9 Кирпич
 
12.11.14
10:52
(8) от у тебя в голове дым. я балдею. :)))
10 Ненавижу 1С
 
гуру
12.11.14
10:55
(8) тут и интерфейс можно
11 Looser-1c
 
12.11.14
10:56
(10) А в дельфи он есть?
12 Кирпич
 
12.11.14
10:58
(11) есть, но по уродски
13 Кирпич
 
12.11.14
10:59
+(12) мож правда уже переделали. они же каждые полгода новые версии шлёпают
14 Ненавижу 1С
 
гуру
12.11.14
11:07
нашел

Note: Delphi allows instantiating a class declared abstract, for backward compatibility, but this feature should not be used anymore

ладно, хотя я не помню про такую директиву класса в ранних версиях, тогда такой вопрос:

Как сделать так, чтобы нельзя было создать объект класса?
15 Кирпич
 
12.11.14
11:09
(14) а зачем такой класс нужен?
16 Ненавижу 1С
 
гуру
12.11.14
11:10
(15) чтобы клиенты библиотеки не могли создать объект базового класса, а только разрешенные дочерние
17 Кирпич
 
12.11.14
11:11
(16) ну пускай создают. тебе жалко что ли.
18 Кирпич
 
12.11.14
11:11
создаст. посмотрит - не работает и больше не будет создавать.
19 Ненавижу 1С
 
гуру
12.11.14
11:13
(17) не логично
20 Кирпич
 
12.11.14
11:16
(19) вообще эта дурь годам к 30-35 должна пройти. так что лучше отложи пока решение этого важного вопроса.
21 Ненавижу 1С
 
гуру
12.11.14
11:17
(20) шарп такое умеет, плюсы тоже, а тут на тебе - нет
22 Кирпич
 
12.11.14
11:30
(21) ну так и пиши на C#, если это для тебя так важно. какой дебил будет создавать экземпляр абстрактного класса, если это не нужно в принципе?
Можно запретить садиться на горячую сковородку. Кому надо тот сядет, а большинству это в голову даже не придёт.
Основная теорема систематики: Новые системы плодят новые проблемы.