Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как правильно унаследовать? / 3 сообщений из 3, страница 1 из 1
10.09.2003, 11:18
    #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
10.09.2003, 11:46
    #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
10.09.2003, 12:04
    #32260966
Артем1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно унаследовать?
В принципе согласен по поводу private в предке.
Про Incompatible types понял, спасибо.

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


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