Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли опубликовать в наследнике функцию ? [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)


Наверх

Титульная страница Поиск, карта сайта Написать письмо