LINUX.ORG.RU

Вопрос по наследованию

 ,


0

1

Здравствуйте.

Имеется нечто подобное:

...

type

    TBBase = class
    private
        _a: Integer;
    public
        procedure SetA(value: Integer);
    end;

    TABase = class
    private
        _b: TBBase;
    public
        constructor Create(b: TBBase);
        procedure SetA(value: Integer);
    end;

    TB = class(TBBase)
    private
        _b: Integer;
    public
        procedure SetB(value: Integer);
    end;

    TA = class(TABase)
    private
        _b: TB;
    public
        constructor Create(b: TB);
        procedure SetB(value: Integer);
    end;

...

implementation

procedure TBBase.SetA(value: Integer);
begin
    _a := value;
end;

constructor TABase.Create(b: TBBase);
begin
    _b := b;
end;

procedure TABase.SetA(value: Integer);
begin
    _b.SetA(value);
end;

procedure TB.SetB(value: Integer);
begin
    _b := value;
end;

constructor TA.Create(b: TB);
begin
    _b := b;
end;

procedure TA.SetB(value: Integer);
begin
    _b.SetB(value);
end;

...

Возможно ли заставить работать метод SetA у объекта типа TA без переобъявления метода внутри класса TA? И как этого добиться?

Спасибо.

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

AIv ★★★★★
()
Ответ на: комментарий от anonymous

к какому боку на линуксячьем форуме дельфи вообще?

Free Pascal Compiler поддерживает в том числе диалект Delphi Language и существует для Linux.

bormant ★★★★★
()
uses tst;

var
  b: TB; a: TA;

begin
  b.Create; a.Create(b);
  a.SetA(1);
  a.Free; b.Free;
end.

Собирается, запускается... А у вас в чём проблема?

bormant ★★★★★
()

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

TABase = class
  _b: TBBase;
...
TA = class(TABase)
  _b: TB;
...
Экземпляр класса TA получит один объект класса TBBase, скрытый в силу совпадения имени ещё одним объектом класса TB. Не думаю, что это именно то, что хотелось получить.

bormant ★★★★★
()
Ответ на: комментарий от anonymous

А как можно скастовать тип атрибута в отнаследованном объекте?

Не совсем понятно, что имелось в виду.
Преобразование типа стандартно: TAnyType(TSomeType). Вот только суть вопроса не в преобразовании типа, а в отсутствии доступа к private полям не из методов самого класса. Преобразовать себя к какому-то предку в методе наследника можно (TSomePre(@Self)), вот только область видмости как в предке в методе наследника не получить, а значит и доступа к скрытому полю без какого-либо хака не получить.

bormant ★★★★★
()

Я когда-то писал на delphi - ужасный язык, хорошо что я отказался от него много много лет назад, хотя бы даже потому что библиотек под него крайне мало, мало архитектур держит даже FPC - мне это критично, поэтому C/C++.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от unC0Rr

Нет, хотя бы покрыть весь спектр железа на котором работает Linux - мне надо.

I-Love-Microsoft ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.