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

Вниз

ООП   Найти похожие ветки 

 
GanibalLector ©   (2005-01-25 14:04) [0]

Имеются классы датчиков давления,температуры и пр. все от TObject.Предположим,выглядят так :

type TTemperatureSensor = class(TObject)
private
FTemperatupe:integer;
public
function GetCurrentTemperature:integer;
Constructor Create(const Temperature:integer);
end;


!!!Необходимо создать класс-коллекцию,котороя будет наполняться из классов датчиков,а также,чтобы она могла вызывать МЕТОДЫ
из классов датчиков.Т.е. "устройсво1" состоит из датчика температуры и давления."устройсво2" состоит из двух датчиков температуры.

Вопрос.Каким образом это сделать?
Поглядев на книгу Буча,вижу что можно создать класс "устройсв" от TCollection.Но,блин,прийдется еще использовать TCollectionitem.И как это все связать я не знаю.

И,второй вариант,Jack128 предложил.Создать класс-коллекцию от TObjectList.Создал,все чудесно наполняется,изменяется и удаляется.
НО!!!Мне необходимо вызывать методы классов датчиков.
Т.е.если TTemperatureSensor имел метод GetCurrentTemperature ,то мне нужно прямо из класса"устройств" вызвать его метод.
Делаю примерно так :

var Q:TSensor;
begin
Q:=TSensor.Create;
Q.Add(TTemperatureSensor.Create(100));
Q.Add(TPressureSensor.Create);
Caption:=inttostr((Q.Items[0] as TTemperatureSensor).GetCurrentTemperature); // до фени

Можно конечно сделать так:

Q:=TSensor.Create;
QQ:=TTemperatureSensor.Create(100);
Q.Add(QQ);
Caption:=inttostr(QQ.GetCurrentTemperature);
...

но я так не хочу.Ибо "устройств" много,а "датчиков" еще больше.И носиться с переменными уж больно не хочется.

Какие будут мысли?


 
Arm79 ©   (2005-01-25 14:13) [1]

а так к примеру нельзя?

type
 TSensorType = (stTemperature, stPress, stUnknown);
...

type
 TCommonSensor = class (TObject)
 private
   FType : TSensorType;
 public
   function GetValue: Variant;
 end;

...

function TCommonSensor.GetValue: Variant;
begin
 case FType of
   stTemperature: Value := (Self as TTemperatureSensor).GetCurrentTemperature;
   stPress: Value := (Self as TPressSensor).GetCurrentPress;
 else
   raise Exception.Create("Unknown sensor type! function TCommonSensor.GetValue")
 end;
end;


 
Arm79 ©   (2005-01-25 14:34) [2]

или, как вариант, прикрутить все классы датчиков к одному интерфейсу


 
GanibalLector ©   (2005-01-25 14:36) [3]

>или, как вариант, прикрутить все классы датчиков к одному интерфейсу

Это как ?


 
REA   (2005-01-25 14:39) [4]

А какая предметная область? У меня есть классы для сети цифровых датчиков.

>Создать класс-коллекцию от TObjectList.Создал,все чудесно наполняется,изменяется и удаляется. НО!!!Мне необходимо вызывать методы классов датчиков.

Абсолютно тоже самое:
If List.Items[i] is TTemperatureSensor Then
  SomeTemp := TTemperatureSensor(List.Items[i]).GetCurrentTemperature;


 
GanibalLector ©   (2005-01-25 14:43) [5]

>А какая предметная область?
Да никакой.Это я из Буча взял.
А можно ли взглянуть на Ваши классы цифровых датчиков...чисто в учебных целях.
Спасибо,кстати.


 
TUser ©   (2005-01-25 14:46) [6]

Может быть сделать все датчики наследником от типа TDatchick?


 
GanibalLector ©   (2005-01-25 14:48) [7]

>Может быть сделать все датчики наследником от типа TDatchick?
И что это изменит?


 
Arm79 ©   (2005-01-25 14:54) [8]

Схематично:

type
 ISensor = interface
   ["{808A95E8-AAD1-4D6E-920A-8A599DC8FD75}"] // Ctrl+Shift+G
   function GetValue : Variant;
 end;

 TSensorTemp = class(TInterfacedObject, ISensor)
 public
   function GetCurrentTemp: Integer;
   function GetValue: Variant;
 end;
 
 TSensorPress = class(TInterfacedObject, ISensor)
 public
   function GetCurrentPress: Integer;
   function GetValue: Variant;
 end;

...

function TSensorTemp.GetValue;
begin
 Result := GetCurrentTemp;
end;  

function TSensorTemp.GetValue;
begin
 Result := GetCurrentPress;
end;  

...
var
 Value : Variant;
 iS : ISensor;
 lsS: TObjectList;   // к примеру
begin
 ...
   iS := lsS.objects[i];  // что то в этом роде. набираю от руки, не проверить
   Value := iS.GetValue;
 ...
end;


 
Ega23 ©   (2005-01-25 15:23) [9]

type

TSensor(TObject)
 private

 public

  function GetSensorValue:Variant; virtual; abstract;

end;

TTemperatureSensor(TSensor)
 private

 public
  function GetSensorValue:Variant; override;
end;

TPressureSensor(TSensor)
 private

 public
  function GetSensorValue:Variant; override;
end;

TDevice(TObject)
 private
  FItems:TObjectList;
  function GetItemByIndex(Index: Integer): TSensor;
 public
  property Items[Index:Integer]:TSensor Read GetItemByIndex;
end;



Я бы что-то в таком духе наваял...


 
jack128 ©   (2005-01-25 15:24) [10]

Arm79 ©   (25.01.05 14:54) [8]
в данном случае можнно не париться с интерфейсами..
type
TSensor = class
public
  property Value: Double;  
end;

TTemperatureSensor = class(TSenser);
TPressureSenser = class(TSensor);


 
Arm79 ©   (2005-01-25 15:40) [11]

я и не парился. Это же я и предлагал в Arm79 ©   (25.01.05 14:13) [1]. Интерфейсы просто как вариант.


 
Ega23 ©   (2005-01-25 15:46) [12]

Интерфейсы просто как вариант.

В мозгу картинку увидел interface as variant.

Пора домой...


 
jack128 ©   (2005-01-25 15:49) [13]

GanibalLector ©   (25.01.05 14:04)
Т.е. "устройсво1" состоит из датчика температуры и давления."устройсво2" состоит из двух датчиков температуры.


При таком определении устройства(у тя устройство - это совокупность нескольких строго заданных и не меняющихся со временем датчиков) о TSensors вообще парится не нужно. Это лишь вспомогательный класс..

type

 TSensor = class
 public
   property Value: Double;
 end;

 TTemperatureSensor = class(TSenser);
 TPressureSensor = class(TSensor);

 TDevice = class
 public
   function GetSensor(index: Integer): TSensor; virtual; abstract;
   function GetSensorCount: Integer; virtual; abstract;
 end;

 TDevice1 = class(TDevice)
 public
   function GetSensor(index: Integer): TSensor; override;
   function GetSensorCount: Integer; override;

   function TemperatuteSensor: TTemperatureSensor;
   function PressureSensor: TPressureSensor;
 end;

 TDevice2 = class(TDevice)
 public
   function GetSensor(index: Integer): TSensor; override;
   function GetSensorCount: Integer; override;

   function TemperatuteSensor1: TTemperatureSensor;
   function TemperatuteSensor2: TTemperatureSensor;
 end;


Вот если бы клиент сам мог собирать "устройства" из датчиков, то тогда имело бы смысл создать у TDevice свойство Sensors: TSensorList {твой наследник от TObjectList}

Arm79 ©   (25.01.05 15:40) [11]
Это же я и предлагал в Arm79 ©   (25.01.05 14:13) [1].

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


 
Arm79 ©   (2005-01-25 16:24) [14]

Возможно. Спорить с человеком с голубым значком себе дороже :). Особенно если он прав 8).

Мое решение навеяно тем проектом, которым сейчас занимаюсь. Там в функции и процедуры передаются нетипизированные константы. И мне пришлось выносить анализ этих констант в отдельную процедуру.


 
REA   (2005-01-25 17:32) [15]

Типа такого:
Type

 TNetworkItemOption = ( niAllowFind, niAllowCheck, niAllowSetup,
                        niAllowAttach, niAllowDetach, niAllowCalibration,
                        niHidden );
                       
 TNetworkItemOptions = Set Of TNetworkItemOption;
                               
 TNetworkItemState = Set Of (nsError, nsWarning);                              

 TNetworkItem = Class;
 TGSServer    = Class;
 TGSNode      = Class;
 TGSSensor    = Class;

 TNetworkItemClass = Class Of TNetworkItem;

 TNetworkItem = Class(TPersistent)
 Private
   FList: TObjectList;
   FState: TNetworkItemState;
   Function GetServer: TGSServer;
   Function GetNode: TGSNode;
   Function GetSensor(GID: Integer): TGSSensor;
 Protected
   FAddress: String; // Item address
   FID: Integer;     // Item ID
   FItemID: Integer; // Tree ID
   FInitData: String;// Init data
   FName: String;    // Item name
   FOptions: TNetworkItemOptions;
   FParent: TNetworkItem;

   Procedure Detach(Item: TNetworkItem); virtual; // Unregister in database and free
   Procedure Attach(ParentItem, Item: TNetworkItem); overload; virtual;
   Procedure Attach(Item: TNetworkItem); overload; virtual; // Register in database and add to list
   Function  GetOptions: TNetworkItemOptions; virtual;
   Function  QueryAttachItem: TNetworkItem; virtual; // Query attach something
   Function  Setup(Item: TNetworkItem): Boolean; virtual;
 Public
   Constructor Create; overload; virtual;
   Constructor Create(Const Name, Address, InitData: String; ID: Integer; ItemID: Integer); overload; virtual;
   Constructor Create(Const Name, Address, InitData: String; ID: Integer = 0); overload; virtual;
   Destructor Destroy; override;
   Class Function GetMetaClass(Const aClassName: String): TNetworkItemClass;// Load package if needed

   Procedure AddItem(Item: TNetworkItem);
   Procedure Calibrate; virtual;
   Procedure Check; virtual;
   Function  Find: Boolean; virtual;
   Function  IsParentOf(Item: TNetworkItem): Boolean;
   Procedure Notify(Event: TServiceEvent; Sender: TObject=Nil); virtual;
   Procedure Save; // Update database information

   Property Address: String Read FAddress;
   Property ID: Integer Read FID;
   Property InitData: String Read FInitData;
   Property ItemID: Integer Read FItemID;
   Property Items: TObjectList Read FList;
   Property Name: String Read FName Write FName;
   Property Node: TGSNode Read GetNode;
   Property Options: TNetworkItemOptions Read GetOptions;
   Property Parent: TNetworkItem Read FParent;
   Property Sensor[GID: Integer]: TGSSensor Read GetSensor;
   Property Server: TGSServer Read GetServer;
   Property State: TNetworkItemState Read FState Write FState;
 End;

 TGSServerFlags = Set of (sfPrimary, sfNoTimer);

 TGSServer = Class(TNetworkItem)
 Private
   FLogging: Boolean;

   Function  GetConnected: Boolean; virtual; abstract;
   Function  GetScanRate: Integer;
   Procedure SetScanRate(Const Value: Integer);
 Protected
   Procedure SetLogging(Const Value: Boolean); virtual;
{   Procedure HardwareReset;
   SyncronizeTimers}
   Procedure PrepareLogging; virtual; abstract;
 Public
   Procedure Down; virtual; abstract;
   Function  IsUp: Boolean; virtual; abstract;
   Procedure Up; virtual; abstract;

   Property Connected: Boolean Read GetConnected;
   Property Logging: Boolean Read FLogging Write SetLogging;
   Property ScanRate: Integer Read GetScanRate Write SetScanRate;
 End;

 TGSNode = Class(TNetworkItem)
 End;

 TGSDevice = Class(TNetworkItem)
 End;

 TQueryClbrDataProc = Function: Double;

 TGSSensor = Class(TNetworkItem)
 Protected
   FClbrObject: TObject; // Calibration data pointer
 Public
   Constructor Create(Const Name, Address, InitData: String; ID: Integer); override;

   Procedure Calibrate; override;
   Function  CodeToValue(Code: Double): Double; virtual;
   Function  GetData: Double; virtual; abstract;

   Property CalibrationObject: TObject Read FClbrObject;
 End;

 TGSServerClass = Class Of TGSServer;

 TGSNetwork = Class(TNetworkItem)
 Private
   FLogging: Boolean;
   FOnChanged: TNotifyEvent;
   FOnDataChanged: TNotifyEvent;

   Procedure SetLogging(const Value: Boolean);
   Procedure SetServersLogging(const Value: Boolean);
   Procedure LoadItems(ParentItem: TNetworkItem);
 Public
   Constructor Create; override;
   Destructor Destroy; override;

   Procedure AttachTo(Item: TNetworkItem);
   Procedure Changed;
   Procedure DataChanged;
   Procedure Detach(Item: TNetworkItem); override;
   Function  Setup(Item: TNetworkItem): Boolean; override;
   Procedure UpServers;

   Property Logging: Boolean Read FLogging Write SetLogging;
   Property OnChanged: TNotifyEvent Read FOnChanged Write FOnChanged;
   Property OnDataChanged: TNotifyEvent Read FOnDataChanged Write FOnDataChanged;
 End;


 
GanibalLector ©   (2005-01-25 19:45) [16]

Всем спасибо.



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

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

Наверх




Память: 0.53 MB
Время: 0.028 c
1-1106561957
Sphinxx
2005-01-24 13:19
2005.02.06
Вопрос о TStringList


8-1098540867
avlan
2004-10-23 18:14
2005.02.06
Получить последовательность кадров (DSPack)


1-1106728327
s_ilnar
2005-01-26 11:32
2005.02.06
считывание файлов в несколько потоков


14-1106044861
TT
2005-01-18 13:41
2005.02.06
HL


6-1101410970
Strumpf
2004-11-25 22:29
2005.02.06
Определение места сайта в Яндексе