Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1153309221
fast2
2006-07-19 15:40
2006.08.06
Какой размер страницы лучше вибрать при создании БД FireBird?


15-1152426673
Мефисто
2006-07-09 10:31
2006.08.06
SHAppBarMessage(ABM_SETSTATE, pabd) - занчение константы :(


15-1152306828
ronyn
2006-07-08 01:13
2006.08.06
загрузчик не грузит


2-1153123382
ksa2002
2006-07-17 12:03
2006.08.06
Редактирование DBGrid


8-1139150998
guitarist
2006-02-05 17:49
2006.08.06
ScreenMate





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский