Наследование или не наследование свойств родит. класса

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Наследование или не наследование свойств родит. класса

Сообщение qivi » 21.04.2012 19:00:03

Пишу свой клас потомок некого другова класса. У родительского класса есть параметр (свойство) которое мне нужно, НО, мне нужно либо перехватить его изменение и выполнять при этом изменении нужные мне операции, либо вообще не наследовать его из родительского класса и написать самому. Не первый не второй вариант не представляю как реализовать, помогите пожалуйста.
Последний раз редактировалось qivi 21.04.2012 20:07:59, всего редактировалось 1 раз.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Наследование или не наследование свойств родит. класса

Сообщение Brainenjii » 21.04.2012 19:11:11

что-то вроде этого?
Код: Выделить всё
program Project1;

{$mode objfpc}{$H+}

Type

{ TSuperClass }

TSuperClass = Class
  Private
  Protected
    fTarget: Integer;
    Procedure SetTarget(aValue: Integer); Virtual;
  Public
    Property Target: Integer Read fTarget Write SetTarget;
End;

Type

{ TDerivedClass }

TDerivedClass = Class(TSuperClass)
Private
   fDepended: Integer;
  Protected
    Procedure SetTarget(aValue: Integer); Override;
  Public
    Property Dependent: Integer Read fDepended;
End;

{ TDerivedClass }

Procedure TDerivedClass.SetTarget(aValue: Integer);
Begin
  ftDepended := aValue * 2;
  Inherited SetTarget(aValue);
End;

{ TSuperClass }

Procedure TSuperClass.SetTarget(aValue: Integer);
Begin
  If fTarget=aValue Then Exit;
  fTarget:=aValue;
End;

Var
  aDerived: TDerivedClass;
begin
  aDerived := TDerivedClass.Create;
  aDerived.Target := 2;
  WriteLn(aDerived.NewProperty); // <- 4
end.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Наследование или не наследование свойств родит. класса

Сообщение qivi » 21.04.2012 19:49:30

При этом же получится что вобщем то из объекта TDerivedClass я получу доступ к свойству Target родительского TSuperClass?

Это не то. Нужно что б небыло доступа к свойству родительского класса, либо небыло дублирующего свойства у потомка (моего класса).

А можно просто не унаследовать это свойство (выборочно не унаследовать свойство)?

Добавлено спустя 9 минут 51 секунду:
Блин, всё дошло... не так понял...

А что делать если процедура изменения свойства родительского класса находится в непубличном разделе?

Добавлено спустя 3 минуты 43 секунды:
Пишет Error: There is no method in an ancestor class to be overridden
теста ради перенёс в родители процедуру в публичный раздел... всё равно то же самое пишет?!!!
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Наследование или не наследование свойств родит. класса

Сообщение Brainenjii » 21.04.2012 20:14:54

Virtual ключевое слово не забыли?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Наследование или не наследование свойств родит. класса

Сообщение qivi » 21.04.2012 20:28:44

А если его у родителя нету? Это сторонняя библиотека. Как быть?

Добавлено спустя 46 минут 29 секунд:
Кстате Virtual не помогает...
Чёрт с ним, есть возможность не унаследовать свойство?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Наследование или не наследование свойств родит. класса

Сообщение Brainenjii » 22.04.2012 21:25:47

Полагаю, что никак. Сужение интерфейса класса прямо противоречит LSP, а это один из основных принципов проектирования. Как вариант - использовать аналог заместителя - создать класс с полностью идентичным интерфейсом, за исключением "лишнего" свойства. Но, разумеется, подменить оригинал заместителем удастся не везде...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 249

Рейтинг@Mail.ru