![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите по классам!!!
Pups © (2006-07-20 12:11:00)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;
DimaBr (2006-07-20 16:11:00) [1]В том то и дело, что не нужно писать несколько секций TYPE.
> А если при этом хочется скрыть метода Open и Close
Заносим из в секцию PRIVATE и в отдельный модуль. Видимость этой секции распостраняется только в одном модуле.
Ega23 (2006-07-20 16:04:00) [2]
> Вот, придумал такого монстрика :)
Для такой ситуации - понятно. Но зачем для каждого класса писать
type
TFirstClass=class
.....
type
TSecondClass=class
.....
и т.д.
- мне непонятно.
Джо (2006-07-20 15:45:00) [3]> [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 15:41:00) [4]
> Кстати да. Не заметил.
> А кто мне может пояснить: нафига несколько секций type в
> рамках inteface юнита создавать? Равно как и var и const?
>
> Есть в этом сакральный смысл?
Вопрос также касается конструкции
type
TMyClass=class
private
.........
protected
.........
public
.........
protected
.........
public
end;
Ega23 (2006-07-20 15:39:00) [5]
> В [5] приведён нерабочий вариант. Опережающее и последующее
> описание класса должны находиться в одной и той же секции
> type.
>
Кстати да. Не заметил.
А кто мне может пояснить: нафига несколько секций type в рамках inteface юнита создавать? Равно как и var и const?
Есть в этом сакральный смысл?
begin...end (2006-07-20 15:37:00) [6]В [5] приведён нерабочий вариант. Опережающее и последующее описание класса должны находиться в одной и той же секции type.
Ega23 (2006-07-20 15:17:00) [7]
> а как реализовать это в рабочем варианте?
см. [5]
Pups (2006-07-20 15:09:00) [8]>Юрий Зотов © (20.07.06 14:25) [10]
а как реализовать это в рабочем варианте?
Юрий Зотов (2006-07-20 14:25:00) [9]> Pups © (20.07.06 14:20) [8]
Этот прием не может не работать. Если все же не работает, то не сам прием, а его реализация.
Юрий Зотов (2006-07-20 14:21:00) [10]> Pups © (20.07.06 14:10) [6]
Нужно так наз. опережающее объявление - см. выделенную строчку в [7].
Но при таком способе из внутреннего класса будут доступны все методы класса-владельца. Если нужно сделать доступным только один, то вместо ссылки на класс-владелец во внутренний класс можно ввести событие и инициализировать его ссылкой на метод владельца. Тогда внутренний класс просто генерит это событие, ничего ни о каких владельцах не зная вообще.
PS
begin
Я в курсе существования областей видимости. Надеюсь, не я один - поэтому будет понятно, что тут имелось в виду.
end
Pups (2006-07-20 14:20:00) [11]>Прежде чем утверждать - попробовал бы.
вот и попробуй. Не работает.
Ega23 (2006-07-20 14:13:00) [12]
> так не получится - они друг на друга ссылаются, делфи ругаться
> будет, мол неизветнный тип (про классы) - он используется
> вверху, а описан ниже...
>
Прежде чем утверждать - попробовал бы.
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:00) [13]так не получится - они друг на друга ссылаются, делфи ругаться будет, мол неизветнный тип (про классы) - он используется вверху, а описан ниже...
еще есть варианты?
Palladin (2006-07-20 13:49:00) [14]включить в 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 13:36:00) [15]то есть что бы обращаться можно было так:
var Module : TModules;
Module.Open
Module.Analog.ReadValue
Module.Analog.ReadValue - в описании, этот метод должен использовать метод Read класса TModules
вот в чем фишка
Desdechado (2006-07-20 13:35:00) [16]> Open и Close - т.е. доступным сделать только Read
Не понимаю, как можно читать метод.
А по доступности элеменотов класса читать protected, private, public
Pups (2006-07-20 13:32:00) [17]А если при этом хочется скрыть метода Open и Close - т.е. доступным сделать только Read- это как?
clickmaker (2006-07-20 12:14:00) [18]объявить в классе Аналог св-во типа TModules. При создании объекта Аналог инициализировать