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

Вниз

Подскажите по классам!!!   Найти похожие ветки 

 
Pups ©   (2006-07-20 12:11) [0]

type TAnalog = class
 function ReadValue(channel : integer) : integer;
end;

type TModules = class
 Analog : TAnalog;
 function Open (deviceName : string) : boolean;
 function Close : boolean;
 function Read(command : string): string;
end;

Вопрос такой:

function TAnalog.ReadValue(channel : integer): integer;
begin
  как мне вызвать отсюда метод Read объекта N типа класса TModules
end;


 
clickmaker ©   (2006-07-20 12:14) [1]

объявить в классе Аналог св-во типа TModules. При создании объекта Аналог инициализировать


 
Pups ©   (2006-07-20 13:32) [2]

А если при этом хочется скрыть метода Open и Close - т.е. доступным сделать только Read- это как?


 
Desdechado ©   (2006-07-20 13:35) [3]

> Open и Close - т.е. доступным сделать только Read
Не понимаю, как можно читать метод.
А по доступности элеменотов класса читать protected, private, public


 
Pups ©   (2006-07-20 13:36) [4]

то есть что бы обращаться можно было так:

var Module : TModules;

Module.Open
Module.Analog.ReadValue

Module.Analog.ReadValue - в описании, этот метод должен использовать метод Read класса TModules

вот в чем фишка


 
Palladin ©   (2006-07-20 13:49) [5]

включить в TAnalog ссылку на объект-владелец

что нибудь типа

type
TModules=Class;
TAnalog = class
Owner:TModules;
function ReadValue(channel : integer) : integer;
public
constructor Create(AOwner:TModules);
end;

type TModules = class
Analog : TAnalog;
function Open (deviceName : string) : boolean;
function Close : boolean;
function Read(command : string): string;
end;

Constructor TAnalog.Create;
Begin
Owner:=AOwner;
End;

function TAnalog.ReadValue(channel : integer): integer;
begin
Owner.Read(...)
end;


 
Pups ©   (2006-07-20 14:10) [6]

так не получится - они друг на друга ссылаются, делфи ругаться будет, мол неизветнный тип (про классы) - он используется вверху, а описан ниже...

еще есть варианты?


 
Ega23 ©   (2006-07-20 14:13) [7]


> так не получится - они друг на друга ссылаются, делфи ругаться
> будет, мол неизветнный тип (про классы) - он используется
> вверху, а описан ниже...
>


Прежде чем утверждать - попробовал бы.
type
TModules=Class;
TAnalog = class
Owner:TModules;
function ReadValue(channel : integer) : integer;
public
constructor Create(AOwner:TModules);
end;

type TModules = class
Analog : TAnalog;
function Open (deviceName : string) : boolean;
function Close : boolean;
function Read(command : string): string;
end;

Constructor TAnalog.Create;
Begin
Owner:=AOwner;
End;

function TAnalog.ReadValue(channel : integer): integer;
begin
Owner.Read(...)
end;


 
Pups ©   (2006-07-20 14:20) [8]

>Прежде чем утверждать - попробовал бы.

вот и попробуй. Не работает.


 
Юрий Зотов ©   (2006-07-20 14:21) [9]

> Pups ©   (20.07.06 14:10) [6]

Нужно так наз. опережающее объявление - см. выделенную строчку в [7].

Но при таком способе из внутреннего класса будут доступны все методы класса-владельца. Если нужно сделать доступным только один, то вместо ссылки на класс-владелец во внутренний класс можно ввести событие и инициализировать его ссылкой на метод владельца. Тогда внутренний класс просто генерит это событие, ничего ни о каких владельцах не зная вообще.

PS
begin
 Я в курсе существования областей видимости. Надеюсь, не я один - поэтому будет понятно, что тут имелось в виду.
end


 
Юрий Зотов ©   (2006-07-20 14:25) [10]

> Pups ©   (20.07.06 14:20) [8]

Этот прием не может не работать. Если все же не работает, то не сам прием, а его реализация.


 
Pups ©   (2006-07-20 15:09) [11]

>Юрий Зотов ©   (20.07.06 14:25) [10]

а как реализовать это в рабочем варианте?


 
Ega23 ©   (2006-07-20 15:17) [12]


> а как реализовать это в рабочем варианте?


см. [5]


 
begin...end ©   (2006-07-20 15:37) [13]

В [5] приведён нерабочий вариант. Опережающее и последующее описание класса должны находиться в одной и той же секции type.


 
Ega23 ©   (2006-07-20 15:39) [14]


> В [5] приведён нерабочий вариант. Опережающее и последующее
> описание класса должны находиться в одной и той же секции
> type.
>


Кстати да. Не заметил.
А кто мне может пояснить: нафига несколько секций type в рамках inteface юнита создавать? Равно как и var и const?
Есть в этом сакральный смысл?


 
Ega23 ©   (2006-07-20 15:41) [15]


> Кстати да. Не заметил.
> А кто мне может пояснить: нафига несколько секций type в
> рамках inteface юнита создавать? Равно как и var и const?
>
> Есть в этом сакральный смысл?


Вопрос также касается конструкции
type

TMyClass=class
  private
   .........    
  protected
   .........
  public
   .........

  protected
   .........
  public
end;


 
Джо ©   (2006-07-20 15:45) [16]

> [14] Ega23 ©   (20.07.06 15:39)
> А кто мне может пояснить: нафига несколько секций type в
> рамках inteface юнита создавать? Равно как и var и const?

Вот, придумал такого монстрика :)

const
 MAX_CONNECTIONS = 3;

type
 TConnection = record
   Name: string;
   ...
 end;

 TConnections = array [1..MAX_CONNECTIONS] of TConnection;

const
 Connections: TConnections = ( (Name:"1"), (Name:"2"), (Name:"3") ) ;


 
Ega23 ©   (2006-07-20 16:04) [17]


> Вот, придумал такого монстрика :)


Для такой ситуации - понятно. Но зачем для каждого класса писать
type
TFirstClass=class
.....
type
TSecondClass=class
.....
и т.д.
- мне непонятно.


 
DimaBr   (2006-07-20 16:11) [18]

В том то и дело, что  не нужно писать несколько секций TYPE.

> А если при этом хочется скрыть метода Open и Close

Заносим из в секцию PRIVATE и в отдельный модуль. Видимость этой секции распостраняется только в одном модуле.



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

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

Наверх




Память: 0.51 MB
Время: 0.072 c
2-1153328997
learner
2006-07-19 21:09
2006.08.06
NamedPipe информация о подсоединившемся клиенте.


2-1152790137
novill
2006-07-13 15:28
2006.08.06
Какой тип лучше использовать для небольших строк?


3-1149251071
Still Swamp
2006-06-02 16:24
2006.08.06
Посомтрим на проблему FB с другой стороны...


2-1153351176
batya17
2006-07-20 03:19
2006.08.06
Закрытие окна


2-1153304775
Acidlex
2006-07-19 14:26
2006.08.06
ExitWindowsEx