powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как правильно унаследовать?
3 сообщений из 3, страница 1 из 1
Как правильно унаследовать?
    #32260891
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Есть у меня класс:
Код: plaintext
1.
2.
3.
4.
5.
6.
TBase = class
  public
    procedure Method(param: Pointer); overload;
    procedure Method(param: Integer); overload;
    function Function1(param: Pointer): Integer; overload;
    function Function1(param: Integer): Pointer; overload;
  end;


Это типа предок. В нем все основные алгоритмы.
Классическая задача - унаследовать от него класс, который будет работать
с конкретными объектами.
Т.е. я преследую цель проверки типа объекта при использовании потомка.
Переопределяю все методы с Pointer:
Код: plaintext
1.
2.
3.
4.
5.
TDesc = class(TBase)
  public
    procedure Method(param: TObject);
    function Function1(param: TObject): Integer; overload;
    function Function1(param: Integer): TObject; overload;
  end;


Собственно вопрос. Что надо писать в реализации методов?
Хотелось бы максимально облегчить себе работу.
Типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function TDesc.Function1(param: Integer): TObject;
begin
  inherited;
end;

function TDesc.Function1(param: TObject): Integer;
begin
  inherited;
end;

procedure TDesc.Method(param: TObject);
begin
  inherited;
end;

А что то нифига не выходит для TDesc.Function1(param: Integer): TObject;
Пишет Incompatible types.
Приходится делать так,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
function TDesc.Function1(param: Integer): TObject;
var p: Pointer;
begin
  p := inherited Function1(param);
  if Assigned(p) then
    Result := TObject(p)
  else
    Result := nil;
end;

но так лениво.
Да вдобавок у TDesc я вижу 3 варианта Function1, в том числе и с Pointer от предка, который я хотел спрятать.
И такая фигня проходит:
Код: plaintext
  FDesc.Method(Pointer( 1 ));

Типа Pointer(1) - это TObject
Я что-то неправильно делаю или как?
...
Рейтинг: 0 / 0
Как правильно унаследовать?
    #32260940
Speaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первое что пришло на ум, сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
type
TBase = class
  protected
    procedure PointerMethod(param: Pointer); overload;
    procedure IntegerMethod(param: Integer); overload;
    function  PointerFunction1(param: Pointer): Integer; overload;
    function  IntegerFunction1(param: Integer): Pointer; overload;
  end;

TDesc = class(TBase)
  public
    procedure Method(param: TObject);
    function  Function1(param: TObject): Integer; overload;
    function  Function1(param: Integer): TObject; overload;
  end;

implementation

{ TBase }

procedure TBase.PointerMethod(param: Pointer);
begin
end;

procedure TBase.IntegerMethod(param: Integer);
begin
end;

function TBase.PointerFunction1(param: Pointer): Integer;
begin
    Result :=  0 ;
end;

function TBase.IntegerFunction1(param: Integer): Pointer;
begin
    Result := nil;
end;

{ TDesc }

procedure TDesc.Method(param: TObject);
begin
    self.PointerMethod( param );
end;

function TDesc.Function1(param: TObject): Integer;
begin
    Result := self.PointerFunction1( param );
end;

function TDesc.Function1(param: Integer): TObject;
begin
    Result := self.IntegerFunction1( param );
end;


А вообще, если по-правильному, то все функции предка нужно сделать
private, и публиковать из через property в потомках.
Либо сделать их виртуальными и protected, а в потомке повысить уровень
доступа и переопределять конкретные функции с учетом специфики.
Что, правда, практически то же самое, что и первое :)

Посмотри про overload и наследование, Incompatible types из-за того, что
при наследовании ты меняешь тип возвращаемого значения.
...
Рейтинг: 0 / 0
Как правильно унаследовать?
    #32260966
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе согласен по поводу private в предке.
Про Incompatible types понял, спасибо.

Жаль, что, видимо, не удастся обойтись без ручного дописывания потомков
и прямого вызова методов предка. Тогда это становится больше похоже на
делегирование, а не на наследование. Я надеялся, что компилятор мне сам
все это дело организует. Ну да ладно, спасибо.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как правильно унаследовать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]