com接口与对象内容摘要:

} }。 class IPersist { virtual void Delete()=0。 virtual void *Dynamic_cast(const char *psz)=0。 virtual void Save(const char *pszFile)=0。 virtual void Load(const char *pszFile)=0。 }。 对象实现多个接口 (续五 ) 一个对象实现两个没有继承关系的接口 include class CMyString : public IString2, public IPersist {...} void *CMyString::Dynamic_cast(const char *psz) { if (strcmp(psz,IString)==0) return static_castIString *(this)。 else if (strcmp(psz,IString2)==0) return static_castIString2 *(this)。 else if (strcmp(psz,IPersist)==0) return static_castIPersist *(this)。 return NULL。 } 对象实现多个接口 (续六 ) void main() { IString *p = CreateString(Hello)。 if (p) { IString2 *p2。 IPersist *p3。 const char*psz = pFind(llo)。 int n = pLength()。 if ((p2=(IString2 *)pDynamic_cast(IString2))) char c = p2FindAt(3)。 if ((p3=(IPersist *)pDynamic_cast(IPersist))) p3Save(c:\\temp\\)。 pDelete()。 } }。 对象实现多个接口 (续七 ) 接口的转换 每个接口提供一个用于接口转换的函数 对象实现接口的时候,可以使用 C++编译器本身提供的类型转换功能 每个接口的 Dynamic_cast函数决定了客户可以访问其他哪些接口 对象的生命周期管理 对象只需要被删除一次。 每个接口都有Delete函数。 还是只有一个接口才有。 进一步, 什么时候删除对象。 客户可能拥有多个指向对象的引用, 每个引用各有自己的 lifetime 每个引用从被有效赋值开始,一直到生命周期结束,这期间被称为: outstanding reference 未完结引用 客户管理每个引用的 lifetime, 也就是说它要 显式 地告诉对象引用无效了 对象的生命周期管理 (续 ) 每个对象要管理一个被称为引用计数(reference count)的整数值。 为了有效地管理对象的生命周期,它应该提供一些规则和操作,供客户遵守和使用: 规则:保持引用计数的确切含义,也就是记录当前 outstanding reference的数目。 引用计数从 0开始,首次把接口递交给客户时为 1,以后由客户管理,当引用计数回到 0时,删除自己。 当客户通过复制获得新的接口指针时,引用计数加一,当某个接口不用时,减一 引用计数的两个操作 我们用引用计数的两个管理操作代替原来简单的Delete函数 class IString { virtual void DestroyPointer()=0。 virtual void *Dynamic_cast(const char *psz)=0。 virtual void DuplicatePointer()=0。 virtual const char*Find(const char *psz)=0。 virtual int Length()=0。 }。 class IPersist { virtual void DestroyPointer()=0。 virtual void *Dynamic_cast(const char *psz)=0。 virtual void DuplicatePointer()=0。 virtual void Save(const char *pszFile)=0。 virtual void Load(const char *pszFile)=0。 }。 实现引用计数的两个操作 CMystring::CMyString(const char * psz) : m_psz( new char[psz ? strlen(psz)+1 :1]), m_refcount(0) { if ( psz ) strcpy(m_psz,psz)。 else m_psz[0] = 0。 } void CMyString::DestroyPointer() { if (0m_refcount) m_refcount。 if (0==m_refcount) delete this。 } void CMyString::DuplicatePointer() { m_refcount++。 } include class CMyString : public IString2, public IPersist { private: char *m_psz。 long m_refcount。 public: CMyString(const char * psz)。 ~CMyString()。 void DuplicatePointer()。 void DestroyPointer()。 void *Dynamic_cast(const char *)。 const char*Find(const char *psz)。 int Length()。 char FindAt(int index)。 void Save(const char *pszFile)。 void Load(const char *pszFile)。 }。 接口转换时刻相当于接口复制 void *CMyString::Dynamic_cast(const char *psz) { void *p = NULL。 if (strcmp(psz,IString)==0) p = static_castIString *(this)。 else if (strcmp(psz,IString2)==0) p = static_castIString2 *(this)。 else if (strcmp(psz,IPersist)==0) p = static_castIPersist *(this)。 if (NULL!=p) m_refcount++。 return p。 } 客户管理对象的生命周期 void main() { IString *p = CreateString(Hello)。 if (p) { IString2 *p2。 IPersist *p3。 const char*psz = pFind(llo)。 int n = pLength()。 if ((p2=(IString2 *)pDynamic_cast(IString2))) { char c = p2FindAt(3)。 p2DestroyPointer()。 } if ((p3=(IPersist *)pDynamic_cast(IPersist))) { p3Save(c:\\temp\\)。 p3DestroyPointer()。 } pDestroyPointer()。 } }。 extern C void *CreateString(const char *psz, const char *pszinterface) { void *pret = NULL。 CMyString *p = new CMyString(psz)。 if (NULL!=p) { pret= pDynamic_cast(pszinterface)。 if (NULL==pret) delete p。 } return pret。 } 修改创建。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。