Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.03.2013, 19:40
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию Abstract Error

Всем доброго времени суток!
Вот такая вот программа выдаёт "Abstract Error":

1.Модуль с наследником класса (DescentUnit.pas):
Код:
type
  TDescendantWriter = class(TAscendantWriter)
  public
    function WriteToDoHeader(AHeader: THeader): Boolean; virtual;
  end; // TDescendantWriter = class(TAscendantWriter)

type
  TDescendant = class(TAscendant)
  public
    function StartWrite(AStream: TFileStream): Boolean;
  end; // TDescendant = class(TAscendant)
      
implementation

{ TDescendantWriter }

function TDescendantWriter.WriteToDoHeader(AHeader: THeader): Boolean;
begin
  try
    Write(AHeader, SizeOf(THeader));
    Result := True;
  except
    Result := False;
  end; // try
end; // function TDescendantWriter.WriteToDoHeader(AHeader: THeader): Boolean

{ TDescendant }

function TDescendant.StartWrite(AStream: TFileStream): Boolean;
begin
  Result := inherited StartWrite(AStream, TDescendantWriter);
end; // function TDescendant.StartWrite(AStream: TFileStream): Boolean
2.Модуль с предком класса (AscentUnit.pas):
Код:
type
  THeader = packed record
    A, B: Word;
  end; // THeader = packed record 

  TAscendantWriter = class(TWriter)
  private
    function WriteToDoHeader(AHeader: THeader): Boolean; virtual; abstract;
  end; // TAscendantWriter = class(TWriter)
  TWriterClass = class of TAscendantWriter;

  TAscendant = class(TObject)
  protected
    FFiler: TFiler;
    FFilerClass: TWriterClass;
    FHeader: THeader;

    function WriteHeader: Boolean;

    property Filer: TFiler read FFiler;
    property WriterClass: TWriterClass read FFilerClass;
  public
    function StartWrite(AStream: TStream;
      AWriterClass: TWriterClass): Boolean;
  end; // TAscendant = class(TObject)
      

implementation

{ TAscendant }

function TAscendant.StartWrite(AStream: TStream;
  AWriterClass: TWriterClass): Boolean;
begin
  try
    FFilerClass := AWriterClass;
    FFiler := WriterClass.Create(AStream, 16384);
    Result := WriteHeader;
  except
    Result := False;
  end; // try
end; // function TAscendant.StartWrite(AStream: TStream;
     //   AWriterClass: TCatToDoBasicWriterClass): Boolean

function TAscendant.WriteHeader: Boolean;
begin
  Result := (Filer <> nil) and
            (Filer as WriterClass).WriteToDoHeader(FHeader); // место
                                                             // возникновения
                                                             // ошибки
end; // function TAscendant.WriteHeader: Boolean
Понятно, что обращение происходит к методу из AscentUnit.pas - TAscendantWriter.WriteToDoHeader(AHeader: THeader): Boolean; virtual; abstract;
Как сделать так, чтобы вызывылся метод из DescentUnit.pas - TDescendantWriter.WriteToDoHeader(AHeader: THeader): Boolean; virtual; ?
Реально наследников у абстрактного класса несколько, выбирать нужный необходимо в runtime, поэтому жёстко прописать в программе конкретный нельзя. Разумеется приведённая здесь версия кода сильно упрощённая, реально в классе-предке прописано много чего, поэтому дублировать всё это в наследниках не хочется. Может вместо
(Filer as WriterClass).WriteToDoHeader(FHeader) написать как-то по-другому? Или в объявлении методов что-то подкорректировать? Полностью проект прилагается в заархивированном виде.
Помогите пожалуйста!

Последний раз редактировалось BBBCat, 12.03.2013 в 18:46.
Ответить с цитированием
  #2  
Старый 10.03.2013, 19:48
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

А оверрайдить кто его будет?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 10.03.2013, 20:00
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
А оверрайдить кто его будет?
А что оверрайдить? Абстрактный метод не получается.
Ответить с цитированием
  #4  
Старый 10.03.2013, 20:01
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Знаешь как абстрактные методы работают, как их перекрывать и т.д.?

Остальные, не подсказывайте!
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 10.03.2013 в 20:03.
Ответить с цитированием
  #5  
Старый 10.03.2013, 20:05
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Я так понимаю, что они как раз не работают. Существуют для создания скелета с последующим наполнением кодом в наследниках. Что я и пытаюсь сделать. Только вот как-то криво получается
Ответить с цитированием
  #6  
Старый 10.03.2013, 20:09
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Читай: http://www.delphisources.ru/pages/fa...l_methods.html

Ошибка очевидная.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #7  
Старый 10.03.2013, 20:11
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Спасибо, сейчас почитаю.
Ответить с цитированием
  #8  
Старый 10.03.2013, 20:33
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

M.A.D.M.A.N. В предке убрал abstract, в наследнике добавил override, ошибку больше не выдаёт, спасибо! Но пришлось добавить пустое тело метода раз уж он перестал быть абстрактным. А вот никак нельзя оставить его абстрактным и обойтись без пустой функции?
Ответить с цитированием
  #9  
Старый 10.03.2013, 20:49
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

virtual; abstract; так же override'ом перекрывается. Добавь абстракт и выкинь пустое тело.

Вот видишь, решение очевидное. Опыт +5, знания + 1.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
BBBCat (10.03.2013)
  #10  
Старый 10.03.2013, 20:50
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Всё получилось с абстрактным методом, спасибо M.A.D.M.A.N. !!! Но вот хоть убейте, уверен, что так уже пробовал и выдавало ошибку на этапе компиляции(Build All). Видимо глючу...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:27.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025