Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
ВнизПодскажите по классам!!! Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.012 c