Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.042 c
1-1106656658
Leon1
2005-01-25 15:37
2005.02.06
Паненель с иконками окошек?


1-1106259842
Bobby Digital
2005-01-21 01:24
2005.02.06
StringGird pt2


6-1100771473
MegaVolt
2004-11-18 12:51
2005.02.06
Какой порт отвечает за работу с расшаренными ресурсами.


1-1106467912
4eshka)
2005-01-23 11:11
2005.02.06
Программа глючит через 1 год работы


1-1106300584
Мила
2005-01-21 12:43
2005.02.06
Закрывается программа





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский