|
From: Ruth Ivimey-C. <Rut...@iv...> - 2009-07-19 22:14:04
|
On Sunday 19 July 2009, Christoph Bartoschek wrote:
> Hi,
>
> could you please show the class InstrumentDTP41? Is multiple interitance
> involved?
Yes, but not straight away and the "multiple" is a pure-virtual.
This is the class that forms the Qt plugin interface. It's multiply inheriting, but this one appears to work ok.
-----------------------------------------
class GL_DTP41_EXPORT PluginDTP41: public QObject, public PluginInterface
{
Q_OBJECT;
Q_INTERFACES(PluginInterface);
public:
PluginDTP41();
virtual ~PluginDTP41();
virtual QStringList plugins() const;
virtual InstrumentInterface *createInstrument(QString plugin, const TargetDefBase *theTarget) const;
virtual void deleteInstrument(InstrumentInterface *i);
};
-----------------------------------------
And this is the one you asked about. It inherits singly from InstrumentBase, which is a class implementing the base functionality of InstrumentInterface, which is pure-virtual. However, InstrumentBase needs to be a QObject, so multiply-inherits QObject and the interface.
So:
InstrumentDTP41
: public InstrumentBase
: public QObject, public InstrumentInterface
-----------------------------------------
class InstrumentDTP41: public InstrumentBase
{
Q_OBJECT;
public:
virtual ~InstrumentDTP41();
InstrumentDTP41(const TargetDefBase *theTarget);
virtual bool ReadTarget(QString &colorant);
virtual QStringList possiblePorts() const;
private:
};
-----------------------------------------
Even the definition of InstrumentBase is big, but this is part of it...
-----------------------------------------
class InstrumentBase: public QObject, public InstrumentInterface
{
Q_OBJECT;
protected:
InstrumentReadMode readMode;
QString portType;
QString portParams;
MeasurementTypes measurementType;
IlluminantTypes illuminant;
QString instrumentName;
QString instrumentSerialNo;
QString instrumentVersion;
const TargetDefBase *target;
MeasurementCollection *densities;
public:
typedef QList<InstrumentCommand> InstrumentCommandList;
InstrumentBase(const TargetDefBase *theTarget);
virtual ~InstrumentBase();
virtual QStringList possiblePorts() const = 0;
virtual QString ToXML() const;
virtual ObserverAngles ObserverAngle() const
{
return OBS_NONE;
};
virtual QString InstrumentName() const
{
return instrumentName;
};
...
virtual void setPortParams(const QString &value)
{
portParams = value;
};
virtual bool Connect() { return true; };
virtual bool Disconnect() { return true; };
private:
Q_DISABLE_COPY(InstrumentBase);
};
-----------------------------------------
> Please also show InstrumentInterface.
It's pure a virtual interface definition:
-----------------------------------------
class InstrumentInterface
{
public:
typedef QList<InstrumentCommand> InstrumentCommandList;
virtual QStringList possiblePorts() const = 0;
virtual QString ToXML() const = 0;
virtual ObserverAngles ObserverAngle() const = 0;
virtual QString InstrumentName() const = 0;
virtual QString InstrumentVersion() const = 0;
virtual QString InstrumentSerialNo() const = 0;
virtual void setInstrumentSerialNo(QString serial) = 0;
virtual const TargetDefBase *Target() const = 0;
virtual void setTarget(TargetDefBase *value) = 0;
virtual MeasurementCollection *Densities() = 0;
virtual InstrumentReadMode ReadMode() const = 0;
virtual IlluminantTypes Illuminant() const = 0;
virtual void setIlluminant(IlluminantTypes value) = 0;
virtual MeasurementTypes MeasurementType() const = 0;
virtual void setMeasurementType(MeasurementTypes value) = 0;
virtual QString PortType() const = 0;
virtual void setPortType(QString value) = 0;
virtual QString PortParams() const = 0;
virtual void setPortParams(const QString &value) = 0;
virtual bool Connect() = 0;
virtual bool Disconnect() = 0;
virtual bool WriteData(QString &dat, int &lenWritten) = 0;
virtual bool ReadData(QString &dat, int numWanted, int &numGot, int timeout) = 0;
virtual bool CheckError() = 0;
virtual bool SendCommand(QString &cmd, SendErrorCheckMode errChk) = 0;
virtual bool SendCommands(InstrumentCommandList &commands, SendErrorCheckMode errChk) = 0;
virtual bool Configure() = 0;
virtual void EndReading() = 0;
virtual bool ReadTarget() = 0;
virtual bool ReadTarget(QString &colorant) = 0;
};
--
Engineer, Author and Webweaver
|