![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли опубликовать в наследнике функцию ? [D7, WinXP]
Sphinx © (2005-03-08 17:19:00)Запутался меж двух кустов :)
имеется некий компанент вида :
TMyCompanent = class(TObject)
private
FValue: Integer;
protected
functionDoSome(aValue);
propertyValue: Integer readFValue writeFValue;
end;
и имеется наследник :
TChildren = class(TMyComp)
public
propertyValue; // <= публикуется свойство родителя
end;
вопрос...можно ли опубликоватьfunctionDoSomeв piblicTChildren?
bar (2005-03-25 14:35:00) [1]Если тебе нужна именно функция то можешь использовать такой фокус.
TMyCompanent = class(TObject)
private
FValue: Integer;
function Getvalue(const x, y: Integer; S: string; sender: Tobject): string;
protected
property Value[const x, y: Integer; S: string; sender: Tobject]: string read
Getvalue;
end;
TChilder = class(TMyCompanent)
public
property Value;
end;
...implementation....
function TMyCompanent.Getvalue(const x, y: Integer; S: string; sender: Tobject):
string;
begin
result := s + inttostr(x + y) + ' ' + sender.ClassName;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
s: TChilder;
begin
s := TChilder.Create;
caption := s.Value[10, 12, 'hello', Memo1];
s.Free;
end;
Причем свойство Value можно определить не только в TMyCompanent но и в Childer.
Получаешь почти настоящую функцию, только параметры надо перечислять в [] , а не в ().
Зато можешь переопределять в потомках хоть как public, хоть как private.
Кроме того о отличи от виртуальных и динамических методов обращение к свойству
вызывает Getvalue по статическуму адресу.
Вот такие шутники в борланде: опубликовать метод в потомке нельзя, зато можно
использовать свойство как функцию.
Набережных С. (2005-03-08 18:49:00) [2]
> Sphinx © (08.03.05 18:38) [7]
Ну ты погоди расстраиваться. Может кто знает, подскажет еще. А я, собственно, присоединяюсь к вопросу:)
Sphinx (2005-03-08 18:38:00) [3]Жаль...значит буду переопределять...
Спасибо огромное за помощь...
Набережных С. (2005-03-08 18:28:00) [4]А ведь похоже, что так просто нельзя, извини. Встречал ведь где-то в справке, что можно, а как - даже и не задумывался. Похоже, без переопределения никак, синтаксис не позволяет:(
Sphinx (2005-03-08 18:13:00) [5]> Плохиш © (08.03.05 17:55) [4]
Да я уже запутался просто...
пробовал ставить в предкеfunction DoSome(aValue); virtual;, но тогда в потомке или получается что функция скрывает метод предка, или перезагружают, но всё равно требуют объявления функции в потомке и вызовуinheritedдля вызова функции предка, вот этого я и не хочу. Мне интересно можно ли просто перенести функцию из protected в public как в приведенном примере опубликовано свойство...если можно - то какие параметры нужны...
Плохиш (2005-03-08 17:55:00) [6]Вот сообщение об ошибке прочитаешь и всё поймёшь.
Sphinx (2005-03-08 17:38:00) [7]> Набережных С. © (08.03.05 17:31) [2]
Спасиба :)
тогда другой вопрос...как ? :)
TChildren = class(TMyCompanent)
public
propertyValue; // <= публикуется свойство родителя
functionDoSome; // <= ошибка
end;
Набережных С. (2005-03-08 17:31:00) [8]Можно.
Sphinx (2005-03-08 17:21:00) [9]сорри...ошибка..читать :
TChildren = class(TMyCompanent)