Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Вниз

TStrings и не понятное исключение   Найти похожие ветки 

 
Дядя   (2007-09-09 11:15) [0]

Добрый день!
Проблема возникла. Мне неоходимо создать экзэмпляр класса TStrings. Использую при этом метод Create. Но при использовании программы, когда приходит время потрудится моему экзэмпляру, появляется исключение. Не пойму в чём дело.
Отрывки кода:
File List: TStrings;
****
FileList:=TStrings.Create;
FileList.LoadFromFile(***);
****


 
Инс ©   (2007-09-09 11:24) [1]

Это абстрактный класс. Нужно создавать экземпляры его потомков.


 
DrPass ©   (2007-09-09 11:24) [2]


> Мне неоходимо создать экзэмпляр класса TStrings

В любом букваре, и в справке Delphi ясно ж написано, что TStrings - это абстрактный класс, и нельзя создавать его экземпляры.
Возьми TStringList


 
ProgRAMmer Dimonych ©   (2007-09-09 11:24) [3]

Сам по молодости с таким сталкивался. Там где-то в справке так мелко и незаметно стыдливо упоминается, что даже то, что объявлено как TStrings должно создаваться через TStringList.Create(). А вообще почему не пользовать TStringList? Возможности те же + ещё больше.


 
Palladin ©   (2007-09-09 11:24) [4]

ну во первых может стоит все таки указать что за исключение то?
хотя, конечно, и так понятно, что за исключение, но на будущее...

FileList:=TStringList.Create;

читай справку по TStrings


 
DrPass ©   (2007-09-09 11:27) [5]

Во накинулись на человека... :)


 
Дядя   (2007-09-09 11:37) [6]

Спасибо за ответы! СтрингЛист попробовал и всё отлично работает! Спасибо!
Я думал использовать TStringList, но сомневался.


 
Anatoly Podgoretsky ©   (2007-09-09 12:29) [7]

> Инс  (09.09.2007 11:24:01)  [1]

Это не абстрактный класс, а базовый, поэтому его правомерно создавать.


 
Anatoly Podgoretsky ©   (2007-09-09 12:29) [8]

> Дядя  (09.09.2007 11:15:00)  [0]

Самое интересное затихарил.


 
Anatoly Podgoretsky ©   (2007-09-09 12:30) [9]

> DrPass  (09.09.2007 11:27:05)  [5]

На человека?
На партизана, а это не человек.


 
Инс ©   (2007-09-09 19:02) [10]


> Это не абстрактный класс, а базовый, поэтому его правомерно
> создавать.

Как это не абстрактный? А какой тогда абстрактный, если не этот?


 
DrPass ©   (2007-09-09 19:07) [11]


> Это не абстрактный класс, а базовый, поэтому его правомерно
> создавать

Из справки:
TStrings contains abstract or, in C++ terminology, pure virtual methods and should not be directly instantiated.
т.е. самый что ни на есть абстрактный :)


 
Anatoly Podgoretsky ©   (2007-09-09 19:13) [12]

> DrPass  (09.09.2007 19:07:11)  [11]

Тебе перевести, что здесь написано.
Абстрактный класс это когда нет реализации, а только одно объявление, который нельзя создать, а надо делать обязательного наследника с реализацией. Что то в этом роде появилось в последних версиях Дельфи.
В конференциях Борланда, Borland Team было вынуждено постоянно оправдываться и дезавуировать этот неудачный термин в справке. Это такой же термин, как термин база по отношению к таблицам.


 
Инс ©   (2007-09-09 19:20) [13]


> [12] Anatoly Podgoretsky ©   (09.09.07 19:13)

Это вопрос терминологии. Кстати, по такой терминологии получается, что в Delphi вообще нет абстрактных классов.


 
Anatoly Podgoretsky ©   (2007-09-09 19:22) [14]

> Инс  (09.09.2007 19:20:13)  [13]

Получается, если не брать в расчет старшии версии, но там я внимательно не смотрел.
Правильный термин Базовый класс


 
DrPass ©   (2007-09-09 19:23) [15]


> Anatoly Podgoretsky ©   (09.09.07 19:13) [12]

В Delphi нет полностью абстрактных классов, какие есть в некоторых других языках. И нет ничего страшного, что в терминологии языка Dephi "абстрактный класс" относится к классу, содержащему абстрактные методы. Разработчики к этому привыкли и этим успешно пользуются. И впервые слышу, что кто-то там из-за этого должен оправдываться.
Тем более, что создавать экземпляры классов с абстрактными методами, хоть и можно, но крайне нежелательно, это является признаком некачественного кода


 
Anatoly Podgoretsky ©   (2007-09-09 19:27) [16]

procedure DoSomething; virtual; abstract;
вот когда будет объявление
x = class(any); abstract;
вот тогда и можно будет говорить, это абстрактный класс.


 
Инс ©   (2007-09-09 19:28) [17]


> [14] Anatoly Podgoretsky ©   (09.09.07 19:22)

Все знакомые мне источники, называют такие классы именно абстрактными. Хотя бы даже вот этот:
http://rsdn.ru/article/Delphi/delphiabs.xml
Ведь серьезное издание, RSDN Magazine. А тут попался такой глупый автор, да и редакторы проморгали. Нету на них Анатолия, объяснил бы ;)


 
Anatoly Podgoretsky ©   (2007-09-09 19:31) [18]

> Инс  (09.09.2007 19:28:17)  [17]

Ну и что, если у самого законодателя такие ляпы являются нормой.


 
Anatoly Podgoretsky ©   (2007-09-09 19:31) [19]

> Инс  (09.09.2007 19:28:17)  [17]

А что мне то объяснять, если TeamB все объяснили, а это Люди.


 
Инс ©   (2007-09-09 19:34) [20]

Просто это вопрос терминологии. Базовый класс не обязательно должен содержать абстрактные методы. Как же тогда назвать класс с абстрактными методами? Так уж повелось, что в терминологии Delphi они называются абстрактными. И я по прежнему считаю, что нет в этом никакой ошибки.


 
Вася Правильный   (2007-09-09 19:37) [21]

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


 
Anatoly Podgoretsky ©   (2007-09-09 19:37) [22]

> Инс  (09.09.2007 19:34:20)  [20]

Не обязан, но тогда это законченый класс и его уже не совсем правомерно так называть, поскольку он может полность работать самостоятельно без наследования.
Но любой класс, от которого наследуются является базовым для наследуемого.


 
Anatoly Podgoretsky ©   (2007-09-09 19:38) [23]

> Вася Правильный  (09.09.2007 19:37:21)  [21]

О чем и речь и в чем нам отказывают некоторые.
А вот абстрактный класс в принципе создать нельзя, он просто не существует в природе, это всего лишь шаблон.


 
Инс ©   (2007-09-09 19:39) [24]


> [21] Вася Правильный   (09.09.07 19:37)

Открыл нам глаза :)


> [22] Anatoly Podgoretsky ©   (09.09.07 19:37)

Каждый останется при своем :)


 
{RASkov} ©   (2007-09-09 19:40) [25]

> Но любой класс, от которого наследуются является базовым
> для наследуемого.

Тогда они все базовые.... кроме самых "последних" :)


 
DrPass ©   (2007-09-09 19:40) [26]


> Anatoly Podgoretsky ©   (09.09.07 19:37) [22]

Так TStrings ведь самостоятельно без наследования работать не может


> Ну и что, если у самого законодателя такие ляпы являются
> нормой

Законодатель появится, если язык будет стандартизован. А в данном случае законодательствовать некому


 
{RASkov} ©   (2007-09-09 19:43) [27]

Если есть хотябы один абстрактный метод, то класс тоже абстрактный :) Ну вот так вот я привык уже...
:)
Хотя Анатолий тоже прав... т.е. не он а Тим Б :)


 
Anatoly Podgoretsky ©   (2007-09-09 19:44) [28]

> Инс  (09.09.2007 19:39:24)  [24]

Так я и не расчитывал, что удастся перетащить в мой лагерь


 
Инс ©   (2007-09-09 19:47) [29]

То, о чем Вы говорите, Анатолий, в среде скорее всего не реализуемо. Error вместо Warning-a то выдать можно, но как быть, если передать тип класса не напрямую, а через классовую ссылку? Синтаксический анализатор не отследит это. Я имею в виду такой случай:
TA = class; abstract;

procedure p(A: TClass);
begin
 with A.Create do begin
   ...
 end;
end;

....
p(TA);


 
Anatoly Podgoretsky ©   (2007-09-09 19:48) [30]

> DrPass  (09.09.2007 19:40:26)  [26]

Может, пока не используешь хранилище данных, которое должно быть реализовано путем замены абстрактных методов реальными.


 
Anatoly Podgoretsky ©   (2007-09-09 19:51) [31]

> Инс  (09.09.2007 19:47:29)  [29]

Ошибки при обращение к абстрактным методам выдаются в рантайм, как ты не создавай объект прямо или косвенно, это заложено в VMT на уровне генов.
Кстати так было не всегда, вначале в ТП5.5 и далее абстрактных методов не было и программисту приходилось создавать (эмулировать) их вручную, за счет создания реального метода abstract и назначая его нужным методам.


 
Инс ©   (2007-09-09 19:56) [32]


> Ошибки при обращение к абстрактным методам выдаются в рантайм

:)) Я в курсе. Я говорю о другом. Вы говорите "абстрактный класс" - класс, экземпляры которого нельзя создавать. И чтобы это отслеживал синтаксический анализатор и выдавал ошибки при компиляции. Так я понял? Я говорю, что это при данной объектной модели скорее всего невозможно.


 
Anatoly Podgoretsky ©   (2007-09-09 20:02) [33]

> Инс  (09.09.2007 19:56:32)  [32]

Неправильно, для абстрактного класса возникала бы ошибка времени компиляции и программа просто бы не откомпилировалась.
Но я напомню, что вроде бы в старших версиях Дельфи появились абстрактные классы.


 
Инс ©   (2007-09-09 20:05) [34]


> Неправильно, для абстрактного класса возникала бы ошибка
> времени компиляции и программа просто бы не откомпилировалась.

А я что сказал: "И чтобы это отслеживал синтаксический анализатор и выдавал ошибки при компиляции.".


> Но я напомню, что вроде бы в старших версиях Дельфи появились
> абстрактные классы.

Не встречал. Посмотрю, уточню. Так как повторю, мне кажется невозможность сего при существующей объектной модели.


 
DrPass ©   (2007-09-09 20:06) [35]


> Anatoly Podgoretsky ©   (09.09.07 19:48) [30]

Скажем, так: может, но это не имеет смысла. Как не имеет смысла и наш с вами спор, т.к. это просто бесполезная борьба терминологий. Называть ли абстрактным классом только класс, который нельзя создать, или класс, содержащий абстрактные методы.
Причин считать первый вариант истиной я не вижу, т.к. это лишь частный случай реализаций объектной модели в некоторых языках. Вы не считаете верным второй вариант. Это ваше дело, я ж вам пальцы в дверь не зажму, чтобы переубедить...


 
Вася Правильный   (2007-09-09 20:28) [36]


> Так TStrings ведь самостоятельно без наследования работать не может

как это? у меня работает
не трогай абстрактных методов, а остальное доступно и работает


 
Anatoly Podgoretsky ©   (2007-09-09 20:34) [37]

> Вася Правильный  (09.09.2007 20:28:36)  [36]

Не совсем, не только абстрактные методы, но и другие которые затрагивают хранилище данных, у этого класса оно отсутствует. AddStrings, LoadFromFile и так далее.


 
MetalFan ©   (2007-09-09 20:38) [38]


> Но я напомню, что вроде бы в старших версиях Дельфи появились
> абстрактные классы.

именно так и есть (BDS 2006)
A class type declaration has the form
type
  className = class [abstract | sealed] (ancestorClass)
     memberList  
  end;

where className is any valid identifier, the sealed or abstract keyword is optional, (ancestorClass) is optional, and memberList declares members - that is, fields, methods, and properties - of the class. If you omit (ancestorClass), then the new class inherits directly from the predefined Borland.Delphi.System.TObject class. If you include (ancestorClass) and memberList is empty, you can omit end. A class type declaration can also include a list of interfaces implemented by the class; see Implementing Interfaces.

If a class is marked sealed, then it cannot be extended through inheritance. If a class is marked abstract, then it cannot be instantiated directly using the Create constructor. An entire class can be declared abstract even if it does not contain any abstract virtual methods. A class cannot be both abstract and sealed.


 
Инс ©   (2007-09-09 20:42) [39]


> [38] MetalFan ©   (09.09.07 20:38)

Речь о .NET?


 
Anatoly Podgoretsky ©   (2007-09-09 20:54) [40]

> Инс  (09.09.2007 20:42:39)  [39]

Не важно, важно что появились абстрактные классы.


 
Инс ©   (2007-09-09 20:55) [41]


> Не важно, важно что появились абстрактные классы

Еще как важно, совсем другая объектная модель :)


 
Anatoly Podgoretsky ©   (2007-09-09 21:06) [42]

> Инс  (09.09.2007 20:55:41)  [41]

Мы же не про модель, а про термин абстрактный класс.
Я же не делал упора на модель, когда говорил, что в начале не было абстрактных методов.


 
Anatoly Podgoretsky ©   (2007-09-09 21:07) [43]

> Инс  (09.09.2007 20:55:41)  [41]

Кроме того не исключено появление этого и под Win32/64


 
Инс ©   (2007-09-09 21:08) [44]


> Мы же не про модель, а про термин абстрактный класс.

Я делал. Перечитайте мои сообщения, поймете почему.


 
MetalFan ©   (2007-09-09 21:13) [45]


> Речь о .NET?

нет, это под Win32. про .Net там ни слова


 
Инс ©   (2007-09-09 21:35) [46]

Да, Win32, но "защита" то немного туповатая, не справится со случаем, описанным в [29]. Хотя такое нововведение действительно "подменяет" термин абстрактного класса.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.039 c
2-1189490393
Washington
2007-09-11 09:59
2007.10.07
Форма поверх окон


2-1189424050
Mariya
2007-09-10 15:34
2007.10.07
Поиск в Delphi


2-1188793357
philinsul
2007-09-03 08:22
2007.10.07
Разбираю копирование файлов (и по сети тоже)


15-1189253128
OzoM
2007-09-08 16:05
2007.10.07
Срочно!!!


15-1189250656
tesseract
2007-09-08 15:24
2007.10.07
Футболки обсуждаем тут!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский