Наследование или не наследование свойств родит. класса
Модератор: Модераторы
Наследование или не наследование свойств родит. класса
Пишу свой клас потомок некого другова класса. У родительского класса есть параметр (свойство) которое мне нужно, НО, мне нужно либо перехватить его изменение и выполнять при этом изменении нужные мне операции, либо вообще не наследовать его из родительского класса и написать самому. Не первый не второй вариант не представляю как реализовать, помогите пожалуйста.
Последний раз редактировалось qivi 21.04.2012 20:07:59, всего редактировалось 1 раз.
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
что-то вроде этого?
Код: Выделить всё
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.При этом же получится что вобщем то из объекта TDerivedClass я получу доступ к свойству Target родительского TSuperClass?
Это не то. Нужно что б небыло доступа к свойству родительского класса, либо небыло дублирующего свойства у потомка (моего класса).
А можно просто не унаследовать это свойство (выборочно не унаследовать свойство)?
Добавлено спустя 9 минут 51 секунду:
Блин, всё дошло... не так понял...
А что делать если процедура изменения свойства родительского класса находится в непубличном разделе?
Добавлено спустя 3 минуты 43 секунды:
Пишет Error: There is no method in an ancestor class to be overridden
теста ради перенёс в родители процедуру в публичный раздел... всё равно то же самое пишет?!!!
Это не то. Нужно что б небыло доступа к свойству родительского класса, либо небыло дублирующего свойства у потомка (моего класса).
А можно просто не унаследовать это свойство (выборочно не унаследовать свойство)?
Добавлено спустя 9 минут 51 секунду:
Блин, всё дошло... не так понял...
А что делать если процедура изменения свойства родительского класса находится в непубличном разделе?
Добавлено спустя 3 минуты 43 секунды:
Пишет Error: There is no method in an ancestor class to be overridden
теста ради перенёс в родители процедуру в публичный раздел... всё равно то же самое пишет?!!!
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Virtual ключевое слово не забыли?
А если его у родителя нету? Это сторонняя библиотека. Как быть?
Добавлено спустя 46 минут 29 секунд:
Кстате Virtual не помогает...
Чёрт с ним, есть возможность не унаследовать свойство?
Добавлено спустя 46 минут 29 секунд:
Кстате Virtual не помогает...
Чёрт с ним, есть возможность не унаследовать свойство?
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Полагаю, что никак. Сужение интерфейса класса прямо противоречит LSP, а это один из основных принципов проектирования. Как вариант - использовать аналог заместителя - создать класс с полностью идентичным интерфейсом, за исключением "лишнего" свойства. Но, разумеется, подменить оригинал заместителем удастся не везде...
