Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Можно ли опубликовать в наследнике функцию ?   Найти похожие ветки 

 
Sphinx ©   (2005-03-08 17:19) [0]

Запутался меж двух кустов :)
имеется некий компанент вида :

TMyCompanent = class (TObject)
 private
   FValue: Integer;
 protected
   function DoSome(aValue);
   property Value: Integer read FValue write FValue;
end;


и имеется наследник :

TChildren = class (TMyComp)
 public
   property Value;    // <= публикуется свойство родителя
end;


вопрос...можно ли опубликовать function DoSome в piblic TChildren?


 
Sphinx ©   (2005-03-08 17:21) [1]

сорри...ошибка..читать :
TChildren = class (TMyCompanent)


 
Набережных С. ©   (2005-03-08 17:31) [2]

Можно.


 
Sphinx ©   (2005-03-08 17:38) [3]

> Набережных С. ©   (08.03.05 17:31) [2]

Спасиба :)

тогда другой вопрос...как ? :)

TChildren = class (TMyCompanent)
 public
   property Value;    // <= публикуется свойство родителя
   function DoSome;   // <= ошибка
end;


 
Плохиш ©   (2005-03-08 17:55) [4]

Вот сообщение об ошибке прочитаешь и всё поймёшь.


 
Sphinx ©   (2005-03-08 18:13) [5]

> Плохиш ©   (08.03.05 17:55) [4]

Да я уже запутался просто...

пробовал ставить в предке function DoSome(aValue); virtual;, но тогда в потомке или получается что функция скрывает метод предка, или перезагружают, но всё равно требуют объявления функции в потомке и вызову inherited для вызова функции предка, вот этого я и не хочу. Мне интересно можно ли просто перенести функцию из protected в public как в приведенном примере опубликовано свойство...если можно - то какие параметры нужны...


 
Набережных С. ©   (2005-03-08 18:28) [6]

А ведь похоже, что так просто нельзя, извини. Встречал ведь где-то в справке, что можно, а как - даже и не задумывался. Похоже, без переопределения никак, синтаксис не позволяет:(


 
Sphinx ©   (2005-03-08 18:38) [7]

Жаль...значит буду переопределять...

Спасибо огромное за помощь...


 
Набережных С. ©   (2005-03-08 18:49) [8]


> Sphinx ©   (08.03.05 18:38) [7]

Ну ты погоди расстраиваться. Может кто знает, подскажет еще. А я, собственно, присоединяюсь к вопросу:)


 
bar   (2005-03-25 14:35) [9]

Если тебе нужна именно функция то можешь использовать такой фокус.

 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 по статическуму адресу.

Вот такие шутники в борланде: опубликовать метод в потомке нельзя, зато можно

использовать свойство как функцию.



Страницы: 1 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
2-1131006047
ZaW
2005-11-03 11:20
2005.11.20
Динамический Popup


1-1130335504
BobbyDigital
2005-10-26 18:05
2005.11.20
"..." в пути к файлу


2-1131051786
StasStas
2005-11-04 00:03
2005.11.20
Не сделать элементарную вещь ...


2-1130741502
Fostr
2005-10-31 09:51
2005.11.20
TListBox


14-1130348890
Knight
2005-10-26 21:48
2005.11.20
Если кто-то будет в IRC-е... забегайте