Замена результата выполнения метода в производных классах

Рейтинг: 1Ответов: 1Опубликовано: 04.07.2023

Здравствуйте уважаемые пользователи. Есть метод в базовом классе, который я хотел бы использовать во всех наследниках.

Базовый класс:

TRootClass = class
public
   function ToJsonString: string;
   class function FromJsonString(const AJsonString: string): TRootClass;
end;

Наследник:

TBuilding = class(TRootClass)
private
  FId: integer;
  FName: string;
  FAdress: string;
  FAdmin: string;
public
 class function FromJsonString(const AJsonString: string): TBuilding;
 property id: integer read GetId write FId;
 property Name: string read GetName write FName;
 property Adress: string read GetAdress write FAdress;
 property Admin: string read GetAdmin write FAdmin;

Собственно метод FromJsonString и хочется использовать во всех дочерних классах, но возник у меня такой вопрос: В данном случае получается что я просто перекрываю метод с таким же названием, однако что будет в случае если я сделаю в базовом классе так:

class function FromJsonString(const AJsonString: string): TRootClass; dynamic; abstract;

Вообще есть ли в этом смысл? Может ли метод из базового класса изменять свое поведение (например возвращать другой тип данных) в производных классах и при этом же быть абстрактным?

p.s Прошу тапками не кидать, сложно дается ООП и все что с ним связанно

Ответы

▲ 1Принят

Как было сказано в комментариях выше @zed и @Akekcvp то есть два варианта решения. В моем случае на текущий момент есть смысл в базовом классе определить метод как:

class function FromJsonString(const AJsonString: string): TRootClass; virtual; abstract;

А в дочернем:

class function FromJsonString(const AJsonString: string): TBuilding; reintroduce;

В целом как указал @Akekcvp - можно использовать приведение типа, но на текущий момент считаю использование reintroduce более подходящим способом.