Symbian C++程序开发中纯虚类的妙用
提起关于symbian程序的开发,让我印象最深的是纯虚类的应用,几乎是随处可见,但如果你是做MFC应用开发,却是很难看到纯虚类的使用的,刚开始我一直以为是因为嵌入式程序有较多的异步消息响应才会用到纯虚类,当我学会自己运用纯虚类来为自己的程序设计接口时,我才发现纯虚类的使用是多么的妙!
我第一次碰到纯虚函数是看到一个关于time out触发控制的类,这个类非常简单,当超时则触发某个处理方法,就让我们来看看这个类是怎么设计的:
先设计一个纯虚函数来实现超时处理方法,当一个类需要运用超时处理时,只要继承这个类,并为这个类的纯虚函数实现处理方法,即可在这个类中实现超时处理方法:
class MTimeOutNotify
{
public:
virtual void TimerExpired() = 0;
};
下面是一个继承了定时器的类,这个类中带有一个上面纯虚类的对象(即iNotify对象),当出现超时它会调用这个对象的方法,从而建立了超时的处理机制:
class CTimeOutTimer : public CTimer
{
public:
static CTimeOutTimer* NewL(const TInt aPriority, MTimeOutNotify& aTimeOutNotify);
static CTimeOutTimer* NewLC(const TInt aPriority, MTimeOutNotify& aTimeOutNotify);
~CTimeOutTimer();
protected: // From CTimer
virtual void RunL();
private:
CTimeOutTimer(const TInt aPriority, MTimeOutNotify& aTimeOutNotify);
void ConstructL();
private:
// Member variables
MTimeOutNotify& iNotify;
};
下面是关于定时器类的构造方法,从这个构造方法可以看出实例化这个类时需要传入纯虚类的对象:
CTimeOutTimer::CTimeOutTimer(const TInt aPriority, MTimeOutNotify& aTimeOutNotify)
: CTimer(aPriority), iNotify(aTimeOutNotify)
{
}
我们在建立应用这个定时器的类时只要继承纯虚类并重载纯虚类中的方法,然后把应用类的对象作为参数传入即可,假如有一个需要使用超时机制的应用类A,则A中有一个CTimeOutTimer成员对象B,且A类继承了虚类CTimeOutTimer,实例化B则可以这样:
B = new CTimerOutTimer(0,this);
下面函数实现超时回调方法:
void CTimeOutTimer::RunL()
{
iNotify.TimerExpired();
}
在symbian C++ SDK中,几乎所有带异步消息响应的类都必然会有一个纯虚类,因为手机属于嵌入式设备,由于资源有限,很多消息是异步消息,所以随处可以见到纯虚类的应用。但纯虚类并不局限于应用异步消息方法中,它也可以应用于需要产生回调方法的模块接口设计中,应用纯虚类来建立相应的接口简要地说可以有如下这些好处:
1. 模块接口更加清晰;
2. 模块的设计更加独立和灵活;
3. 模块之间的耦合度更小。
还有一个让我有一个说不出的好处,它会让你觉得这种处理回调的方法是多么的妙!让我深感运用C++可以设计出一个结构非常好的程序框架,不象C语言,总给人一种拼凑的感觉(当然,C语言程序也是可以有框架很好的程序的,只是比较少见)。
我总认为编程也会有艺术上的美感享受,当然前提是程序要写得妙。