00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "CommonFramework.h"
00032
00033
00034
00035
00036
00037
00038
00039 class COnePhaser : public CBase {
00040 public:
00041 TInt iInt1;
00042 TInt iInt2;
00043 public:
00044
00045 static COnePhaser* NewL()
00046 {
00047 return new (ELeave) COnePhaser;
00048 };
00049 static COnePhaser* NewLC()
00050 {
00051 COnePhaser* self=COnePhaser::NewL();
00052 CleanupStack::PushL(self);
00053 return self;
00054 };
00055
00056 void Print()
00057 {
00058 _LIT(KFormat1,"COnePhaser {TInt %d, TInt %d}");
00059 console->Printf(KFormat1, iInt1, iInt2);
00060 }
00061 protected:
00062
00063 COnePhaser()
00064 {
00065 iInt1=3;
00066
00067 }
00068 };
00069
00070
00071
00072 class CTwoPhaser : public CBase {
00073 public:
00074 TInt iInt1;
00075 TInt iInt2;
00076 RTimer iTimer;
00077 COnePhaser* iOnePhaser;
00078 public:
00079
00080 static CTwoPhaser* NewLC(TInt aInt1)
00081 {
00082 CTwoPhaser* self=new (ELeave) CTwoPhaser;
00083 CleanupStack::PushL(self);
00084 self->ConstructL(aInt1);
00085 return self;
00086 };
00087 static CTwoPhaser* NewL(TInt aInt1)
00088 {
00089 CTwoPhaser* self=CTwoPhaser::NewLC(aInt1);
00090 CleanupStack::Pop();
00091 return self;
00092 };
00093 virtual ~CTwoPhaser()
00094 {
00095 delete iOnePhaser;
00096 iTimer.Close();
00097 }
00098
00099 void Print()
00100 {
00101 _LIT(KFormat2,"CTwoPhaser {TInt %d, TInt %d, RTimer, ");
00102 console->Printf(KFormat2, iInt1, iInt2);
00103 iOnePhaser->Print();
00104 _LIT(KtxtCloseCurly,"}");
00105 console->Printf(KtxtCloseCurly);
00106 }
00107 protected:
00108
00109 void ConstructL(TInt aInt1)
00110 {
00111 iInt1=aInt1;
00112 User::LeaveIfError(iTimer.CreateLocal());
00113 iOnePhaser=COnePhaser::NewL();
00114 }
00115 };
00116
00117
00118
00119 class CAbstract : public CBase
00120 {
00121 public:
00122 CTwoPhaser* iTwoPhaser;
00123 public:
00124 void SomeFunction(TInt aInt)
00125 {
00126 _LIT(KTxtbeginSomeFunction,"beginning to do SomeFunction()\n");
00127 console->Printf(KTxtbeginSomeFunction);
00128 DoSomeFunction(aInt);
00129 _LIT(KTxtfinishSomeFunction,"finished doing SomeFunction()\n");
00130 console->Printf(KTxtfinishSomeFunction);
00131 }
00132 virtual ~CAbstract()
00133 {
00134 delete iTwoPhaser;
00135 }
00136 protected:
00137 virtual void DoSomeFunction(TInt aInt) const =0;
00138
00139 void ConstructL(TInt aInt)
00140 {
00141 iTwoPhaser=CTwoPhaser::NewL(aInt);
00142
00143 }
00144 };
00145
00146
00147
00148 class CConcrete : public CAbstract
00149 {
00150 public:
00151 COnePhaser* iOnePhaser;
00152 public:
00153
00154 static CConcrete* NewLC(TInt aInt)
00155 {
00156 CConcrete* self=new (ELeave) CConcrete;
00157 CleanupStack::PushL(self);
00158 self->ConstructL(aInt);
00159 return self;
00160 };
00161 static CConcrete* NewL(TInt aInt)
00162 {
00163 CConcrete* self=CConcrete::NewLC(aInt);
00164 CleanupStack::Pop();
00165 return self;
00166 };
00167 virtual ~CConcrete()
00168 {
00169 delete iOnePhaser;
00170 }
00171
00172 virtual void DoSomeFunction(TInt aInt) const
00173 {
00174 _LIT(KFormat3,"CConcrete::DoSomething(%d)\n");
00175 console->Printf(KFormat3, aInt);
00176 }
00177 protected:
00178
00179 void ConstructL(TInt aInt)
00180 {
00181 CAbstract::ConstructL(aInt);
00182 iOnePhaser=COnePhaser::NewL();
00183 }
00184 };
00185
00186
00187 LOCAL_C void doExampleL()
00188 {
00189
00190 CTwoPhaser* twoPhaser=CTwoPhaser::NewLC(5);
00191
00192 twoPhaser->Print();
00193 _LIT(KTxtNewLine,"\n");
00194 console->Printf(KTxtNewLine);
00195 CleanupStack::PopAndDestroy();
00196
00197 CAbstract* abstract=CConcrete::NewLC(9);
00198
00199 abstract->SomeFunction(11);
00200 CleanupStack::PopAndDestroy();
00201 }