1 设计思路

  1. #include "istring.h"
  2. class IAnyInterface
  3. {
  4. virtual void *DynamicCast(const char *psz)=0;
  5. virtual void DuplicatePointer()=0;
  6. virtual void DestroyPointer()=0;
  7. };
  8. class IString
  9. {
  10. virtual void Delete()=0;
  11. virtual const char*Find(const char *psz)=0;
  12. virtual int Length()=0;
  13. };
  14. // 对象的接口不能发生变化, 如果接口中需要增加新的方法,可以派生出新的接口来
  15. class IString2 : public IString
  16. {
  17. virtual char FindAt(int index)=0;
  18. };
  19. // 完全增加新的功能
  20. class IPersist
  21. {
  22. virtual void Delete()=0;
  23. virtual void Save(const char *pszFile)=0;
  24. virtual void Load(const char *pszFile)=0;
  25. };
  26. class CMyString : public IString2, public IPersist, public IAnyInterface
  27. {
  28. private:
  29. char *m_psz;
  30. long m_refcount;
  31. public:
  32. CMyString(const char * psz);
  33. ~CMyString();
  34. void DuplicatePointer();
  35. void DestroyPointer();
  36. void *Dynamic_cast(const char *);
  37. const char*Find(const char *psz);
  38. int Length();
  39. char FindAt(int index);
  40. void Save(const char *pszFile);
  41. void Load(const char *pszFile);
  42. };
  1. CMystring::CMyString(const char * psz)
  2. : m_psz( new char[psz ? strlen(psz)+1 :1]),
  3. m_refcount(0) {
  4. if ( psz )
  5. strcpy(m_psz,psz);
  6. else
  7. m_psz[0] = 0;
  8. }
  9. void CMyString::DestroyPointer() {
  10. if (0<m_refcount)
  11. m_refcount--;
  12. if (0==m_refcount)
  13. delete this;
  14. }
  15. void CMyString::DuplicatePointer() {
  16. m_refcount++;
  17. }
  18. // 接口转换时刻相当于接口复制
  19. void *CMyString::Dynamic_cast(const char *psz) {
  20. void *p = NULL;
  21. if (strcmp(psz,"IString")==0)
  22. p = static_cast<IString *>(this);
  23. else if (strcmp(psz,"IString2")==0)
  24. p = static_cast<IString2 *>(this);
  25. else if (strcmp(psz,"IPersist")==0)
  26. p = static_cast<IPersist *>(this);
  27. if (NULL!=p)
  28. m_refcount++;
  29. return p;
  30. }
  1. // 修改创建函数, 让创建函数也正确地维护引用计数
  2. extern "C" void *CreateString(const char *psz, const char *pszinterface) {
  3. void *pret = NULL;
  4. CMyString *p = new CMyString(psz);
  5. if (NULL!=p) {
  6. pret = p->Dynamic_cast(pszinterface);
  7. if (NULL==pret)
  8. delete p;
  9. }
  10. return pret;
  11. }
  1. void main() {
  2. IString *p = CreateString("Hello");
  3. if (p) {
  4. IString2 *p2;
  5. IPersist *p3;
  6. const char*psz = p->Find("llo");
  7. int n = p->Length();
  8. if ((p2=(IString2 *)p->Dynamic_cast("IString2"))) {
  9. char c = p2->FindAt(3);
  10. p2->DestroyPointer();
  11. }
  12. if ((p3=(IPersist *)p->Dynamic_cast("IPersist"))) {
  13. p3->Save("c:\\temp\\str.txt");
  14. p3->DestroyPointer();
  15. }
  16. p->DestroyPointer();
  17. }
  18. };

2 其他要考虑的问题

  • Dll什么时候被卸载?
  • 如何标识一个接口?字符串?
  • 线程安全?
  • 如何标识一个对象?对象的身份?
  • 跨进程?跨机器?对象环境?
  • ……