ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

نویسی شیگرا برنامه فصل چهار

<!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Courier; panose-1:2 7 4 9 2 2 5 2 4 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tms Rmn"; panose-1:2 2 6 3 4 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Helv; panose-1:2 11 6 4 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"New York"; panose-1:2 4 5 3 6 5 6 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:System; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MS Mincho"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"MS 明朝"; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1; mso-font-alt:바탕; mso-font-charset:129; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:PMingLiU; panose-1:2 1 6 1 0 1 1 1 1 1; mso-font-alt:新細明體; mso-font-charset:136; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-alt:"MS ゴシック"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Dotum; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:돋움; mso-font-charset:129; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimHei; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:黑体; mso-font-charset:134; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:MingLiU; panose-1:2 1 6 9 0 1 1 1 1 1; mso-font-alt:細明體; mso-font-charset:136; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:Mincho; panose-1:2 2 6 9 4 3 5 8 3 5; mso-font-alt:明朝; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Gulim; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:굴림; mso-font-charset:129; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:Century; panose-1:2 4 6 3 5 7 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Angsana New"; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:"Cordia New"; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:Mangal; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:32768 0 0 0 0 0;} @font-face {font-family:Latha; panose-1:2 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1048576 0 0 0 0 0;} @font-face {font-family:Sylfaen; panose-1:1 10 5 2 5 3 6 3 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:67110535 0 0 0 159 0;} @font-face {font-family:Vrinda; panose-1:1 1 6 0 1 1 1 1 1 1; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:65539 0 0 0 1 0;} @font-face {font-family:Raavi; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131072 0 0 0 0 0;} @font-face {font-family:Shruti; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:262144 0 0 0 0 0;} @font-face {font-family:Sendnya; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Gautami; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:2097152 0 0 0 0 0;} @font-face {font-family:Tunga; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:4194304 0 0 0 0 0;} @font-face {font-family:"Estrangelo Edessa"; panose-1:3 8 6 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:-2147459008 0 128 0 0 0;} @font-face {font-family:"Arial Unicode MS"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421319 -2147483648 8 0 66047 0;} @font-face {font-family:BNazaninBold; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"Times New Roman"; mso-font-charset:178; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:"Adobe Caslon Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Caslon Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Arno Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Light Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bell Gothic Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bell Gothic Std Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bickham Script Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Bickham Script Pro Semibold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Birch Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackoak Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Brush Script Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Chaparral Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Charlemagne Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Cooper Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eccentric Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Garamond Premr Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Garamond Premr Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Giddyup Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Hobo Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Letter Gothic Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lithos Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Mesquite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Minion Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Med"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro SmBd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Nueva Std Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"OCR A Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Orator Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Poplar Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Prestige Elite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rosewood Std Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Stencil Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tekton Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Ext"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Trajan Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:Marlett; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Console"; panose-1:2 11 6 9 4 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-2147482993 6144 0 0 31 0;} @font-face {font-family:"Lucida Sans Unicode"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-2147476737 14699 0 0 63 0;} @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"Arial Black"; panose-1:2 11 10 4 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Comic Sans MS"; panose-1:3 15 7 2 3 3 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Impact; panose-1:2 11 8 6 3 9 2 5 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Georgia; panose-1:2 4 5 2 5 4 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium"; panose-1:2 11 6 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Palatino Linotype"; panose-1:2 4 5 2 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870009 1073741843 0 0 415 0;} @font-face {font-family:"Trebuchet MS"; panose-1:2 11 6 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Webdings; panose-1:5 3 1 2 1 5 9 6 7 3; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MV Boli"; panose-1:2 0 5 0 3 2 0 9 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 0 256 0 0 0;} @font-face {font-family:AngsanaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:BrowalliaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:"Browallia New"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:CordiaUPC; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:DilleniaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:EucrosiaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:FreesiaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:IrisUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:JasmineUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:KodchiangUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:LilyUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:Aharoni; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:David; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"David Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:FrankRuehl; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Levenim MT"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Miriam; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Fixed"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Fixed Miriam Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Narkisim; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Rod; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Rod Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Traditional Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Arabic Transparent"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Andalus; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic Fixed"; panose-1:2 1 0 9 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Kartika; panose-1:2 2 5 3 3 4 4 6 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:8388611 0 0 0 1 0;} @font-face {font-family:"\@MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:FantasyMatrix; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:FantasyMatrixSmall; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Jokerman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"HolidayPi BT"; panose-1:5 12 1 2 1 2 9 2 2 2; mso-font-charset:2; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"OldDreadfulNo7 BT"; panose-1:4 8 8 5 6 1 7 1 8 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"MisterEarl BT"; panose-1:3 8 8 2 2 3 2 2 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Calligraph421 BT"; panose-1:3 6 7 2 5 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Blackletter686 BT"; panose-1:3 4 8 2 2 6 8 4 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Cataneo BT"; panose-1:3 2 8 2 4 5 2 6 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Staccato222 BT"; panose-1:3 9 7 2 3 4 7 2 4 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"ParkAvenue BT"; panose-1:3 2 6 2 5 5 6 8 7 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Square721 BT"; panose-1:2 11 5 4 2 2 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Broadway BT"; panose-1:4 4 9 5 8 11 2 2 5 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Microsoft Sans Serif"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421663 -2147483648 8 0 66047 0;} @font-face {font-family:"Scruff LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Odessa LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Highlight LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"One Stroke Script LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Mekanik LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Tiranti Solid LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Pump Demi Bold LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Quixley LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"La Bamba LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Rage Italic LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Ruach LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Westwood LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Milano LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Victorian LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Academy Engraved LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Orange LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"John Handy LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Jokerman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Agency FB"; panose-1:2 11 5 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Arial Narrow"; panose-1:2 11 5 6 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arial Rounded MT Bold"; panose-1:2 15 7 4 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackadder ITC"; panose-1:4 2 5 5 5 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT"; panose-1:2 7 6 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Black"; panose-1:2 7 10 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Condensed"; panose-1:2 7 6 6 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Book Antiqua"; panose-1:2 4 6 2 5 3 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bookman Old Style"; panose-1:2 5 6 4 5 5 5 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bradley Hand ITC"; panose-1:3 7 4 2 5 3 2 3 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Calisto MT"; panose-1:2 4 6 3 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Castellar; panose-1:2 10 4 2 6 4 6 1 3 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Century Gothic"; panose-1:2 11 5 2 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Century Schoolbook"; panose-1:2 4 6 4 5 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Copperplate Gothic Bold"; panose-1:2 14 7 5 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Copperplate Gothic Light"; panose-1:2 14 5 7 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Curlz MT"; panose-1:4 4 4 4 5 7 2 2 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Edwardian Script ITC"; panose-1:3 3 3 2 4 7 7 13 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Elephant; panose-1:2 2 9 4 9 5 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Engravers MT"; panose-1:2 9 7 7 8 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Bold ITC"; panose-1:2 11 9 7 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Demi ITC"; panose-1:2 11 8 5 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Light ITC"; panose-1:2 11 4 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Medium ITC"; panose-1:2 11 6 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Felix Titling"; panose-1:4 6 5 5 6 2 2 2 10 4; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Forte; panose-1:3 6 9 2 4 5 2 7 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Franklin Gothic Book"; panose-1:2 11 5 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi"; panose-1:2 11 7 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi Cond"; panose-1:2 11 7 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Heavy"; panose-1:2 11 9 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium Cond"; panose-1:2 11 6 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"French Script MT"; panose-1:3 2 4 2 4 6 7 4 6 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Garamond; panose-1:2 2 4 4 3 3 1 1 8 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Gigi; panose-1:4 4 5 4 6 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Gill Sans MT Ext Condensed Bold"; panose-1:2 11 9 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT"; panose-1:2 11 5 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT Condensed"; panose-1:2 11 5 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold"; panose-1:2 11 10 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold Condensed"; panose-1:2 11 10 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gloucester MT Extra Condensed"; panose-1:2 3 8 8 2 6 1 1 1 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Old Style"; panose-1:2 2 5 2 5 3 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Stout"; panose-1:2 2 9 4 7 3 11 2 4 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Haettenschweiler; panose-1:2 11 7 6 4 9 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Imprint MT Shadow"; panose-1:4 2 6 5 6 3 3 3 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Outlook"; panose-1:5 1 1 0 1 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Maiandra GD"; panose-1:2 14 5 2 3 3 8 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Monotype Corsiva"; panose-1:3 1 1 1 1 2 1 1 1 1; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"OCR A Extended"; panose-1:2 1 5 9 2 1 2 1 3 3; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Palace Script MT"; panose-1:3 3 3 2 2 6 7 12 11 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Papyrus; panose-1:3 7 5 2 6 5 2 3 2 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Perpetua; panose-1:2 2 5 2 6 4 1 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Perpetua Titling MT"; panose-1:2 2 5 2 6 5 5 2 8 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Pristina; panose-1:3 6 4 2 4 4 6 8 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rage Italic"; panose-1:3 7 5 2 4 5 7 7 3 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Rockwell; panose-1:2 6 6 3 2 2 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Condensed"; panose-1:2 6 6 3 5 4 5 2 1 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Extra Bold"; panose-1:2 6 9 3 4 5 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Script MT Bold"; panose-1:3 4 6 2 4 6 7 8 9 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tw Cen MT"; panose-1:2 11 6 2 2 1 4 2 6 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Tw Cen MT Condensed"; panose-1:2 11 6 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Wingdings 2"; panose-1:5 2 1 2 1 5 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Wingdings 3"; panose-1:5 4 1 2 1 8 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Bookshelf Symbol 7"; panose-1:5 1 1 1 1 1 1 1 1 1; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Sans"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lucida Sans Typewriter"; panose-1:2 11 5 9 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Reference Sans Serif"; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"MS Reference Specialty"; panose-1:5 0 5 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Tw Cen MT Condensed Extra Bold"; panose-1:2 11 8 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:ZWAdobeF; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:536885895 0 0 0 511 0;} @font-face {font-family:"Euro Sign"; panose-1:2 11 6 3 2 2 1 2 1 1; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 2 0 0 1 0;} @font-face {font-family:"Lucida Bright"; panose-1:2 4 6 3 7 5 5 2 4 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:SymbolMT; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"MS Gothic"; mso-font-charset:128; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:CourierNewPSMT; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:TimesNewRomanPSMT; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:CourierNewPS-BoldMT; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText {mso-style-noshow:yes; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} span.MsoFootnoteReference {mso-style-noshow:yes; vertical-align:super;} ins {mso-style-type:export-only; text-decoration:none;} span.msoIns {mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single;} span.msoDel {mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:aqua;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

فصل چهار

نویسی شیگرا برنامه

آنچه که در این فصل یاد م یگیرید:

مفاهیم شی گرایی

کلاس، شی و روابط آنها

مدل سازی، نحو هی تعریف کلاس

ارکان سه گانه ی شی گرایی: کپسوله سازی، تخصص، چند ریختی

مفهوم تحلیل و طراحی ش یگرا

برنامه های ویندوزی و وب، برنام ه های پیچید ه ای هستند که در روشهای گرافیکی اطلاعات را به کاربران نمایش م ی دهند و

واسط های کاربران را مرکب از منوهای آبشاری و بازش و 1، دکمه ها، کادر لیس ت 2 و .... پیشنهاد م ی کنند. برنامه ها در پشت این

واسط 3 ها، روابط مفهومی پیچیده همچون روابط مابین مشتر یها و کالاها و سفارش ها و دارائی را مدل م یکنند.

برای مدیریت این پیچیدگی عظیم، برنام ه نویس ها یک تکنیک به نام برنام ه نویسی شی گرا 4 توسعه داد ه اند. آن بر اساس یک

فرضیه ی خیلی س اده است . شما پیچیدگی را با مد ل کردن جنب ه های ضروری سیستم مدیریت کنی د . برنامه ی شما برای مدل

کردن مسئله ای است که سعی دارید حل کنید و ساد هترین راه فهم آن برنامه است.

،( برنامه نویس ها به مسئل ه ای که سعی دارید حل کنید و همه اطلاعاتی که مربوط به این مسئله ه س تند (دامنه مسئل ه 5

مراجعه می کنند . برای مثال، اگر شما یک برنامه برای مدیریت دارائی و فروش یک شرکت بنویسی د . دامنه ی برنامه شامل هر

چیزی درباره نحو ه ی بدست آوردن و مدیریت دارائی، فروش و بکار بردن سود فروش و پ ی گیری ارقام فروش و ... است. باید

مدیر فروش و مدیر سرمایه، کارشناسان دامنه ی مسئله باشند که در فهم دامنه می توانند موثرتر عمل کنند.

یک برنامه ی شی گرا با طراحی خوب، با اشیائی از دامن ه ی مسئله پر م ی شود. برای مثال، اگر دامن ه ی مسئله برای بانکداری

است، ممکن است اشیاء دامنه شامل مشتریان و حسا بها و صورت حساب های ماهیانه و... باشند.

در اولین سطح از طراحی، شما درباره نحو هی تکامل اشیاء، حالت آنها، توانای یها و مسئولی تهای آنها فکر خواهید کرد.

1 PopUp

2 Listbox

3Interface

4 Object oriented programming

5 problem domain

اسلام احمد زاده - 09177112161 - C# برنامه نویسی

80

حالت

یک برنامه نویس به شرائط جاری و مقادیر یک شی، حالت ش ی 1 می گوید. برای مثال، شیئی که یک مشتری را نشان م ی دهد،

در نظر بگیرید. حالت مشتری با آدرس مشتری، شماره تلفن و پست الکترونیکی و نرخ اعتبار مشتری نشان داده می شود.

توانایی ها

مشتری توانایی های زیادی دار د . اما توسع ه دهنده فقط مواردی که مرتبط با دامن ه ی مسئله هستند را مدل م ی کند . پس

احتمالا مشتری قادر است سپرده گذاری، انتقال وجه و برداشت از صندوق و... را انجام دهد.

مسئولیت ها

در امتداد توانای ی ها، مسئولی ت هایی می آین د . شی مشتری مسئول مدیریت آدرس خود اس ت . در یک برنامه با طراحی خوب،

هیچ شی دیگری لازم ندارد به جزئیات آدرس مشتری دسترسی داشته باش د . آدرس به عنوان یک دا د ه با شی مشتری

ذخیره می شود. اما شی مشتری باید بداند چگونه آدرس خودش را بازیابی و بروز کن د . توانایی یک شی برای مسئولی ت پذیری

در برابر حالت و رفتارش به کپسول هسازی 2 معروف است.

-1-4 ایجاد مد لها

انسانها سازندگان مدل هستن د . ما مد ل های دنیا را برای مدیریت پیچی د گی و کمک به فهم مسائل برای حل آنها ایجاد

می کنیم. شما همواره مد لها را می بینید. نقشه ها مد لهایی از جاده ها هستند. گوی ها مدل هایی از زمین هستند.

در اصل مد ل ها نوعی ساد ه سازی 3 بشمار م ی آیند. اگر یک نقشه از ایالت متحده دارید، در صورتی که بخواهید همه چیز ر ا

دقیق روی نقشه بیاورید، نقشه به بزرگی ایالت متحده خواهد بود، ولی در روی نقشه اطلاعات خاص و دقیق قرار م یگیرند.

یک طراحی ش ی گرای خوب، مدل دقیقی از مسئل ه ای است که سعی دارید حل کنی د. انتخاب شی در طراحی، نه تنها نحو ه ی

حل یک مسئله را تحت تاثیر قرار م ی دهد، بلکه نحو ه ی تفکر شما روی مسئله را نیز تحت تاثیر قرار م ی دهد . یک طراحی

خوب، شبیه یک مدل خوب به شما اجازه می دهد، جزئیات مرتبط با مسئله را بدون سردرگمی بررسی کنید.

-2-4 کلاس ها و اشیاء

ما دنیا را مرکب از اشیاء درک م ی کنیم. شما چیزی جز قطعات پلاستیکی و شیش ه ای ادغام شده با محیط را نم ی بینید، شما

بطور طبیعی اشیاء متمایز را م ی بینید. یک کامپیوتر، یک صفحه کلید، یک مانیتور، اسپیکرها، مداد و کاغ ذ . مطلب مهم

اینکه، قبل از اینکه خودتان تصمیم بگیرید، این اشیاء را به گروه مبدل کرد ه اید. شما کامپیوتر روی میزتان را به عنوان یک

نمونه ی خاص از یک نوع گروه بندی می کنید. این کامپیوتر یک نمونه از نوع کامپیوتر است.

1 object state

2 Encapsulation

3 simplification

فصل چهار-برنامه نویسی شی گرا

81

نظریه ی پشت پرده برای برنام ه سازی شی گرا، مد ل سازی صحیح دنیا برای برنام ه های کامپیوتری اس ت . این برنامه ها باید تمایل

این کار را با ایجاد یک کلا س 1 جهت تعریف یک نوع #C انسان را در مورد نمایش تک تک اشیاء و نوع آنه ا منعکس ساز د . در

داده و ایجاد یک نمونه 2 از آن کلاس برای مدل کردن چیزی انجام م یدهید.

یک کلاس یک نوع داد ه ی جدید را تعریف م ی کند. هر کلاسی خصوصیات مشترک هر شی از آن نوع جدید را تعریف

می کند.

هستن د . Car تعلق دارند . آنها از نوع داده ی Car را در نظر بگیری د . ماشین من و شما هر دو به کلاس Car برای مثال، کلاس

است . پس یک Car یک شی، یک نمون ه ی منحصر به فرد از یک کلاس اس ت . هر ماشین منحصربه فرد، یک نمونه از کلاس

شی است و شی نیز یک چیز است.

-3-4 :تعریف یک کلاس:

ویژگی ها را با فیلد عض و 3 شرح #C در زمان تع ر یف یک کلاس، ویژگ ی ها و رفتار اشیاء آن نوع داده را تعریف م ی کنید. در

می دهید.

class Dog

{

private int weight; // member field

private String name; // member field

با وزن و نام جاری آن تعریف می شود. Dog فیلدهای کلاس برای نگهداری حالت شی استفاده می شوند. برای مثال، حالت

حالت یک کارمند با حقوق و سطح مدیریت و نرخ کارائی آن تعریف می شود. شما رفتار نوع داد هی جدیدتان را با متدها

تعریف می کنید. متدها کدی را برای انجام یک عمل در بر می گیرند.

class Dog

{

private int weight;

private String name;

public void Bark( ) // member method

{

// code here to bark

}

معرف های دسترسی هستند که سطح دسترسی به آن فیلد یا متد را مشخص م ی کنند. public و private کلمات کلیدی

از بیرو ن کلاس نیز قابل public فقط در داخل همان کلاس قابل دسترسی هستند، ولی اعضای private اعضای

دسترسی خواهند بود.

1 class

2 instance

3 Member field

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

82

احتمالا متدهایی برای پارس کرد ن 1 و خوردن و چرت Dog یک کلاس تعدادی متد برای کار با آن کلاس تعریف م ی کند. کلاس

زدن 2 و... دارد. کلاس کارمند متدهایی برای تسویه حقوق، بازدیدهای سالیانه و ارزیابی اهداف کارائی در بر می گیرد.

متدها با تغییر دادن مقادیر فیلدهای عضو م ی توانند حالت شی را دستکاری کنن د . یک متد م ی تواند با اشیاء دیگر از همان

نوع یا انواع دیگر تعامل داشته باشن د . تعامل بین اشیاء برای برنام ه نویسی شی گرا بسیار مهم اس ت . برای مثال، یک متد در

Bark ) وزن سگ را تغییر می ده د ). با سگهای دیگر تعامل دار د ، ()Feed کلاس سگ، حالت آن را تغییر م ی دهد. (یک متد

ممکن است یک شی کالا با شی مشتری تعامل داشته باشد. .(BegForFeed) و یا با انسان تعامل دارد ( Sniff و

در یک برنام ه ی شی گرای خوب، شما اشیائی را طرح م ی کنید که در دامنه مسئله شما چیزهائی ر ا نشان م ی دهند. سپس کار

برنامه را با تخصیص مسئولیت به اشیاء (بر اساس توانایی آنها)، مابین اشیاء تقسیم خواهید کرد.

-4-3 روابط کلاس:

برقراری روابط مابین کلا س ها، قلب طراحی ش ی گرا است . کلاس ها با رو ش های مختلفی با بقیه در تعامل بوده و مرتبط هستن د .

،Manager ساده ترین تعامل زمانی است که متدی از یک کلاس، متد کلاس دیگری را فراخوانی م ی کند. برای مثال، کلاس

Employee و کلاس Manager یک شی از کلاس کارمند را فراخوانی م ی کند . می گوئیم کلاس UpdateSalary متد

انجمن 3 هستند. انجمن ما بین کلا سها به معنی تعامل ما بین آنهاست.

بعضی از انواع داد ه های پیچیده از انواع دیگری مرکب م ی شوند. برای مثال، یک خودرو ، از چر خ ها، موتور، سیستم انتقال و ...

تشکیل شده اس ت . برای مدلسازی خودرو، یک کلاس چرخ، یک کلاس موتور و یک کلاس انتقال ایجاد می شو د . پس

می توانید کلاس ماشین را ایجاد کنی د . هر ما شین چهار نمونه از کلاس چرخ، یک نمونه از کلاس موتور و یک نمونه از کلاس

خوانده می شو د . روش دیگر نمایش این رابطه آن است که کلاس خودرو، کلاس Has-a انتقال دارد . این ترکیب عموما رابطه

گویند. Is-a چرخ، موتور و انتقال را تجمع می کند. یا کلاس کار از اشیاء چرخ، موتور و انتقال تشکیل می شود. این رابطه را

این تفاوت اعمال #C تفاوت وجود دارد، ولی در has-a و is-a مابین روابط ++c در بعضی از زبان ها همچون

نم یشود.

رابطه ی تجمع به شما اجازه م ی دهد کلا س های پیچیده را با اسمبل کردن و ترکیب کلاس های ساده ایجاد کنی د . چارچوب

خود را با پنج رشته Address برای بکار بردن رشت ه های متنی فراهم م ی کند. ممکن است کلاس String یک کلاس NET.

است. Address را طوری ایجاد کنید که یک عضو آن از نوع Employee متنی ایجاد کنید. سپس کلاس

-5-4 ارکان س هگانه ی برنامه نویسی شی گرا

برنامه نویسی شئ گرا، بر پ ایه سه رکن ساخته می شو د : کپسوله کردن، تخصص، چند ریخت ی . هر کلاس باید کاملا کپسوله

باشد. آن باید بطور کامل حالت و مسئولیتهای نوع داده را تعریف کن د . تخصص برقراری ارتباط های سلسله مراتبی مابین

1 Bark

2 nap

3 associate

فصل چهار-برنامه نویسی شی گرا

83

کلاسهای خودتان را مجاز می دارد . چندریختی، اجازه می دهد یک گروه از اشیا مرتبط در سلسله مراتب، رفتار مشابهی

نشان دهند.

-1-5-4 کپسوله کردن

کپسوله کردن، اولین رکن برنام ه سازی ش ی گرا است . هدف پشت پرده کپسول ه سازی این است که هر نوع داده یا کلاس را

نگه دارید . بنابراین بدون اینکه هر کلاس دیگری را ت ح ت تاثیر قرار دهد، م ی توانیدمحرمانه و تودا ر (self-contain)

پیاده سازی یک کلاس را تغییر دهی د . متدی که توسط یک کلاس برای استفاده در کلا س های دیگر ایجاد م ی شود،

سرویس دهنده گفته م ی شود و کسی که این متد را بکار م ی برد، یک سروی سگیرنده گفته م ی شود. کپسوله کردن به شما اجازه

می دهد جزئیات مرب و ط به پیاد ه سازی نحوه ی کارکرد سرور را تغییر دهید، بدون اینکه پیاد ه سازی سرویس گیرنده را با

شکست مواجه کنید.

کلاس که از بیرون کلاس قابل دسترسی هستند را واسط کلاس م ی نامند. یک سرویس گیرندهخصوصیات و متدهای public

باید مطمئن باشد که واسط عمومی کلاس تغییر نم ی کند. اگر واسط عمومی کلاس تغییر یابد، پس سروی س گیرنده نیز باید

مجددا طراحی و کامپایل شود.

به عبارت دیگر، پیاده سازی خصوصی مختص خود سروی س دهئده است . طراح کلاس سروی س دهئده برای تغییر واسط عمومی

کلاس خود آزاد است، ولی آن باید پارامترهای معینی را بگیرد، کار و ع ده داده شده را انجام دهد و مقدار وعده داده شده را

را مجاز دارد. public برگرداند و دسترسی به خصوصیات

وجود دارد که یک مقدار بر حسب دلار و تعداد سال را ()NetPresentValue برای مثال، فرض کنید یک متد به نام

می گیرد و مقدار کنونی شبکه را بر م یگرداند. نحوه ی محاسبه به تجارت ما بستگی دارد.

-2-5-4 تخصص

با وراث ت 2 پیاده سازی می شود( با اعلان یک کلاس جدید که از یک #C تخصص1، رکن دوم برنام ه نویسی شی گرا است که در

کلاس موجود ار ث بری می کن د ). کلاس تخصصی شده، ویژگ ی های کلاس کلی را ار ث بری می کند. کلاس تخصصی شده، یک

کلاس مشتق شده 3 نامیده می شود. در حالیکه کلاس کلی، به یک کلاس پایه معروف است.

اشاره م ی شود. سگ یک پستاندار اس ت . ماشین یک وسیله نقلیه است ( سگ از Is-a از رابطه تخصص به عنوان یک رابطه

کلاس پایه ی پستاندار و ماشین از کلاس پای هی وسیله نقلیه مشتق می شود).

است . مدیر توانایی های جدید (استخدام، اخراج ) و حالت جدید (اهداف Employee یک نوع خاصی از Manager ، برای مثال

،Manager ویژگ ی های کلی همه کارمندان را به ارث م ی برد. پس کلاس Manager . سالیانه، سطح مدیری ت ) را اضافه م ی کند

می تواند ارتقاء یا تنزل یابد. Manager یک آدرس، یک نام، یک شماره استخدام دارد و

یک کنترل اس ت . ListBox . یک کنترل اس ت Button ، تخصص، ایجاد یک خانواده از اشیاء را مجاز م ی دارد. در ویندوز

کنترل ها ویژگی های معین (رنگ، اندازه، موقعی ت ) و توانای ی های معین (رسم،انتخاب و ...) دارند. این ویژگی ها و توانای ی ها به

کردن از یک نوع به نوع دیگر، نوع داده paste, cut وسیله همه انواع داده ای مشتق شده از آنها ار ثبری می شود. به جای

مشتق شده فیلدها و متدهای مشترک را به ارث م یبرند.

1 specialization

2 inheritance

3Derived

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

84

-3-5-4 چندریختی

به معنی morph به معنی چن د و poly . چند ریختی، رکن سوم برنام ه نویسی شی گرا است که بسیار مرتبط با وراثت اس ت

شکل است. چندریختی یعنی اینکه یک کلاس یا یک نوع داد هی منفرد، چندین شکل داشته باشند.

در بعضی مواقع شما یک کلکسیون داده از نوع داده کلی داری د . برای مثال،یک کلکسیون از کنتر ل ها را در نظر بگیرید که

مهمترین چیز این است که می دانید همه آنها توانای ی های . (ListBox ،Button ) ؟ نمی دانید زیر نوع خاص هر کدام چیست

مشترکی را به ارث م ی برند. با همه آنها به عنوان کنترل رفتار م ی کنید. اگر شما یک دستور بنویسید که هر کنترل خودش را

بطور مناسب روی هرکنترل پیاد ه سازی می شود، نیازی نیست بد انید که هر کنترل چگونه خود را Draw رسم کند، چون متد

رسم می کند. فقط کافی است بدانید هر کنترل توانایی رسم خود را دارد.

چندریختی به شما اجازه می دهد با یک کلکسیون از انواع داده مشتق شد هی مجزا بصورت یک گروه رفتار کنید.

-6-4 تحلیل و طراحی شی گرا

قبل از برنام ه نویسی هر چیزی، لازم ا س ت دو مرحل ه ی تحلیل و طراحی را انجام دهی د . تحلیل، همان پروس ه ی فهم و تشریح

مسئله ای است که سعی دارید حل کنید. طراحی، همان برنامه ریزی واقعی راه حل تان است.

در مسائل کوچک، ممکن است یک دور ه ی تحلیل گسترده نیاز نباش د . اما در مسئل ه های تجاری پیچیده، پروس ه ی تح لیل

است که شما use-case هفته ها، حتی ما ه ها طول م ی کشد. یک تکنیک تحلیل قدرتمند، ایجاد مواردی بنام سناریوهای

بعضی از جزییات نحوه استفاده از سیستم را شرح م ی دهید. در میان بررسی های دیگر، تعیین فاکتورهای موفقیت و نوشتن

مشخصه ی نیازمندی های برنامه شما وجود دارد.

بعد از اینکه مسئله را تحلیل کردید، شما راه حل را طراحی م ی کنید. کلاس هایی که استفاده خواهید کرد و روابط ما بین آنها

را در پروسه طراحی تصور می کنید. ممکن است یک برنامه ساده را بدون برنامه ریزی دقیق آن طراحی کنید.

چندین تکنیک طراحی قدرتمند برای استفاده ش ما وجود دار د . مقدار زمانی که برای طراحی قبل از شروع کدنویسی صرف

می کنند به پیچیدگی سازمان، انداز هی تیم شما، تجربه و آموزش بستگی دارد.

-7-4 خلاصه

برنامه نویسی شی گرا به برنام ه نویس ها در جهت مدیریت پیچیدگی با مد ل کردن جنبه های ضروری مسئله واقعی

کمک می کند.

کلاس یک نوع داده جدید در برنام ه ی شما تعریف م ی کند و نوعا برای نمایش یک نوع چیز در دامن ه ی مسئله بکار

برده می شود.

یک شی نمونه ای از یک کلاس است.

حالت شی، شرایط جاری یک شی است.

فصل چهار-برنامه نویسی شی گرا

85

بیشتر کلا س ها فیلدهای عضو تعریف م ی کنند که متغیرهای خصوصی بوده و فقط برای مت د های داخل آن کلاس

نمایان هستند.

رفتار کلاس با متدها تعریف م ی شود که قطعه کدی را برای انجام یک عمل در بر دار د . متدها حالت شی را دستکاری

می کنند و با اشیاء دیگر تعامل م یکنند.

کپسوله کردن، تخصص و چندریختی، سه رکن اساسی برنامه نویسی شی گرا هستند.

در کپسوله کردن لازم است هر کلاسی محرمانه و تودار باشد. تخصص به وسیله ی وراثت پیاده سازی می شود.

چندریختی به شما اجازه م ی دهد با یک کلکسیون از اشیائی که انواع آنها از کلاس پایه مشترکی مشتق شد ه اند،

بصورت یک گروه رفتار کنید.

تحلیل ، همان پروسه تشریح مسئل های است که سعی دارید حل کنید.

طراحی، همان برنامه ریزی حل مسئله است.

فصل پنجم

کلاسها و اشیاء

آنچه که در این فصل یاد خواهید گرفت:

نحوهی تعریف یک کلاس و استفاده از آن

معرفهای دسترسی و تاثیر آنها روی اعضای کلاس

سازندهها و مخرب کلاس

اعضای نمونه و ایستای کلاس و تفاوتهای کاربردی آنها

تخصیص حافظه به نمونههای کلاس

this • کلمهیکلیدی

صحبت کردیم. به یاد دارید که این انواع داده برای (#c در فصلهای قبلی در مورد انواع داده درونی (ساخته شده در

تعریف انواع داده جدید برای انطباق با #c نگهداری و دستکاری مقادیر عددی و رشتهای استفاده میشدند. قدرت واقعی

با اعلان و تعریف کلاسها، #c مسایل خاص است. توانایی ایجاد انواع دادهای جدید، یک زبان شیگرا را مشخص میکند. در

انواع دادهی جدید را مشخص میکنید.

نمونههای خاصی از یک کلاس، اشیاء نامیده میشوند. فرق بین یک کلاس و یک شی همانند اختلاف ما بین مفهوم یک سگ

و سگ خاصی به نام جو است. شما نمیتوانید اطلاعات را از یک کلاس سگ واکشی کنید، فقط با یک نمونه از آن کلاس

میتوانید کار کنید.

یک کلاس سگ شرح میدهد، آنها چه چیزهای مشابهی دارند. آنها وزن، طول، رنگ چشم، رنگ مو، مزاج و غیره دارند. آنها

میتوانند کارهای مشابهی انجام دهند، همچون خوردن، راه رفتن، پارسکردن و خوابیدن. هر سگ خاصی، وزن و قد، رنگ

چشم و مو و مزاج خاصی دارد.

مزیت بزرگ برنامهنویسی شیگرا آن است که کلاسها، ویژگیها و تواناییهای یک نوع داده را در یک واحد منحصر به فرد و

تودار کپسوله میکنند.

به عنوان ListBox ویندوز را مرتب کنید. کنترل ListBox برای مثال، فرض کنید میخواهید محتویات یک نمونه از کنترل

یک کلاس تعریف میشود. یکی از ویژگیهای کلاس این است که آن میداند چگونه خود را مرتب کند. مرتبسازی در کلاس

مرتب شود، فقط به آن میگویید که ListBox کپسوله شده و کلاسهای دیگر از نحوهی کار آن مطلع نیستند. اگر بخواهید

خودش را مرتب کند. شما خود را با نحوهی مرتبسازی آن درگیر نمیکنید. این همان کپسولهکردن است.

فصل چهار-برنامه نویسی شی گرا

87

را برای تعریف کلاسهای جدید شرح میدهد. اجزاء یک کلاس از قبیل رفتارهای آن و حالتاین فصل ویژگیهای زبان #C

آن به اعضای کلاس معروف هستند. رفتار کلاس با نوشتن متدها ایجاد میشود. یک متد امر عادی است که هر شیئی از آن

میتواند ListBox داشته باشد و کلاس Bark میتواند متدی به نام Dog کلاس میتواند اجرا کند. برای مثال، یک کلاس

داشته باشد. Sort متدی به نام

حالت کلاس با فیلدها نگهداری میشود. ممکن است فیلدها از انواع داده اولیه یا اشیائی از کلاسهای دیگر باشند.

در نهایت، ممکن است کلاس خصوصیاتی داشته باشد که برای سرویسدهنده شبیه متد ها عمل میکنند، اما برای

سرویسگیرندهی کلاس شبیه فیلدهای کلاس به نظر میرسند. یک سرویس گیرنده، شیئی است که با هر نمونه از کلاسی

تعامل دارد .

-1-5 تعریف کلاس

در زمان تعریف یک کلاس، ویژگیهای همه اشیاء کلاس را به خوبی رفتارهایشان تعریف میکنید. برای مثال، اگر پنجرهسازی

ListBox سیستمعامل خودتان را ایجاد میکنید، ممکن است بخواهید چیزهای صفحه نمایش را ایجاد کنید. کنترل جالب

ها ویژگیهای متعددی همچون ListBox . در نمایش لیستی از انتخابها و توانایی کاربر برای انتخاب از لیست مفید است

طول، عرض، موقعیت و رنگ متن دارند.

برنامهنویسها رفتارهای معینی از کادرلیست 1ها انتظار دارند. آنها میتوانند باز، بسته، مرتب و غیره شوند.

ایجاد کنید که این ویژگیها و تواناییها را ListBox برنامهنویسی شیگرا به شما اجازه میدهد نوع دادهی جدیدی بنام

کپسوله میکند.

برای تعریف یک نوع داده یا کلاس جدید، ابتدا آن را اعلان کرده و سپس متدها و فیلدهای آن را تعریف کنید. یک کلاس را

اعلان کنید. گرامر کامل آن به صورت زیر است. class با استفاده از کلمهی کلیدی

[attributes ] [access-modifiers] class identifier [:base-class] {class-body}

صفات 2 برای فراهمکردن متاداده خاصی درباره یک کلاس استفاده میشوند (اطلاعاتی درباره ساختار یا کاربرد کلاس). صفات

نیاز ندارید. معرفهای دسترسی بعدا بررسی میشوند ( معمولا کلاسهای شما از کلمه کلیدیرا برای برنامهنویسی عادی #C

به عنوان معرف دسترسی خود استفاده میکنند). public

با اسامی نامگذاری میشوند ( سگ، کارمند، کادرلیست ). قوانین #C شناسهی 3 کلاس همان نام کلاس است. کلاسهای

نامگذاری از نمادگذاری پاسکال استفاده میکنند. در نمادگذاری پاسکال خط فاصله یا زیرخط استفاده نمیکنند و در

.(GoldenRetriever) شناسههای یک یا چندکلمهای، حرف اول هر کلمه را بزرگ مینویسند

همانطور که قبلا گفته شد. وراثت یکی از ارکان برنامهنویسی شیگرا است. گزینه اختیاری کلاس پایه در بحث وراثت شرح

داده میشود. تعریف اعضای کلاس در بدنهی کلاس و در داخل آکولادهای باز و بسته قرار میگیرند.

class Dog

{

int age; // the dog's age

int weight; // the dog's weight

Bark( ) { //... }

1 listBox

2 Attributes

3 identifier

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

88

Eat( ) { // ... }

}

همه رفتار سگ را شرح میدهند. فیلدهایی همچون سن و وزن، حالت یا همه ،Dog متدهای موجود در تعریف کلاس

خصوصیات سگ را شرح میدهند.

-1 نمونهسازی 1 اشیاء -1 -5

برای ایجاد یک نمونهی واقعی یا یک شی از کلاس سگ، باید شی را اعلان کرده و برای شی حافظه تخصیص دهید. این دو

مرحله برای ایجاد یک شی یا نمونهسازی لازم هستند. برای اعلان یک شی، ابتدا نام کلاس و به دنبال آن نام شی را

بنویسید.

Dog milo; // declare milo to be an instance of Dog

استفاده میکنیم. پس نام یک Camel این عمل به ایجاد یک متغیر محلی شباهت ندارد. در تعریف شی از قرارداد نمادگذاری

باشد. myDog متغیر یا شی میتواند مانند

عمل اعلان به تنهایی یک نمونهی واقعی ایجاد نمیکند. برای ایجاد یک نمونه از یک کلاس، باید با استفاده از کلمه کلیدی

به آن شی حافظه تخصیص دهیم. new

milo=new Dog();//allocate memory for milo

میتوانید اعلان یک شی و تخصیص حافظه به آن را ترکیب کنید و در یک خط بنویسید.

;() Dog milo=new Dog

را ایجاد میکند. دلیل وجود پرانتزها Dog اعلان میکند و یک نمونهی جدید از Dog را به عنوان شیئی از نوع milo این کد

را بعدا خواهید فهمید.

نقطهی ورود ()Main هر چیزی بوسیلهی یک کلاس اتفاق میافتد. هیچ متدی نمیتواند خارج از کلاس اجرا شود. متد #C در

برنامه ی شما است، که به وسیلهی سیستم عامل فراخوانی میشود و آن جایی است که اجرای برنامه آغاز میشود. شما یک

شبیه هر متد دیگر باید در یک کلاس باشد. ()Main ایجاد خواهید کرد، چون متد ()Main کلاس کوچک برای جا دادن متد

public class Tester

{

public static void Main( )

{

//...

}

}

ندارید. برای این Tester ایجاد شده است، شما هنوز هیچ نمونهای از نوع ()Main برای جا دادن متد Tester اگرچه کلاس

کار خواهیم نوشت:

;()Tester myTester = new Tester

فراخوانی متدهای دیگر کلاس را از طریق شی ایجادشده ممکن میسازد. ،Tester ایجاد یک نمونه از کلاس

1 Instantiate

فصل چهار-برنامه نویسی شی گرا

89

Time -2 ایجاد کلاس -1 -5

حال، کلاسی که زمان را پیگیری و نمایش میدهد، ملاحظه کنید. حالت داخلی کلاس باید قادر به نمایش سال، ماه، روز،

ساعت، دقیقه و ثانیه جاری باشد. ممکن است این کلاس را برای نمایش زمان در قالبهای مختلف بکار برید.

فراهم کرده است. DataTime یک کلاس عملیاتی به نام NET. چارچوب

1) پیادهسازی کنید. - شما این کلاس را با تعریف یک متد و 6 متغیر ( مثال 5

Time 1 کلاس - مثال 5

using System;

public class Time

{

// private variables

private int year;

private int month;

private int date;

private int hour;

private int minute;

private int second;

// public methods

public void DisplayCurrentTime( )

{

Console.WriteLine( "stub for DisplayCurrentTime" );

}

}

public class Tester

{

static void Main( )

{

Time timeObject = new Time( );

timeObject.DisplayCurrentTime( );

}

}

second با اعلان تعدادی متغیر عضو Time ایجاد میکند. تعریف کلاس Time این کد یک نوع داده جدید کاربری به نام

شروع میشود. ,minute ,hour ,day ,month ,year

تعیین میکند که این فیلدها فقط در متدهای داخل کلاس قابل استفاده هستند. کلمه کلیدی private کلمهی کلیدی

یک معرف دسترسی است . private

ترجیح میدهند اعلان فیلدها در کنار هم ( بالا یا پایین) کلاس قرار گیرند. البته #C بیشتر برنامه نویسان

ضروری نیست.

بر میگرداند، به عبارت void است. این متد مقدار DisplayCurrentTime متد ،Time تنها متد اعلانشده در کلاس

دیگر هیچ مقدار برگشتی ندارد.

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

90

ممکن است بخواهیم در ابتدای برنامهنویسی، ساختار کلی برنامه را بدون در نظر گرفتن جزئیات آن ایجاد کنیم، در اینصورت

که فقط DisplayCurrentTime یک دستور ساده در متدها مینویسیم که نشاندهندهی اجرای این متد باشد. مانند متد

یک پیام را در خروجی چاپ میکند.

بنام Time یک نمونه از ()Main را در بردارد. در ()Main تعریف میشود که متد Tester کلاس ،Time بعد از کلاس

ایجاد میشود. timeObject

Time timeObject = new Time( );

آن شی DisplayCurrentTime میتواند از متد ()Main است، متد Time یک نمونه از کلاسچون timeObject

استفاده کرده و آن را برای نمایش زمان فراخوانی کند.

timeObject.DisplayCurrentTime( );

متدی از یک کلاس را با نوشتن نام شی و به دنبال آن نام متد (که با نقطه از هم جدا شده اند)، می توان احضار کرد و

پارامترهای متد در داخل پرانتزها قرار میگیرند. اگر متدی پارامتر نداشته باشد، پرانتز خالی نیز اجباری است.

-3 معرفهای دسترسی -1 -5

1 معرفهای - یک معرف دسترسی نحوه دستیابی به اعضای کلاس، از بیرون یا داخل کلاس را تعیین میکند. جدول 6

را خلاصه میکند. #C دستیابی

1- معرفهای دستیابی - جدول 5

معرف دسترسی محدودیتها 1

علامتگذاری شدهاند، برای هر متد از public بدون محدودیت. اعضایی که با public

هر کلاسی نمایان هستند.

این اعضا فقط به متدهای همان کلاس نمایان هستند. private

این اعضا برای متدهای همان کلاس و کلاسهایی که از آن مشتق شدهاند، protected

نمایان هستند

برای همه کلاسهای موجود در اسمبلی مربوطه نمایان هستند internal

Protected

Internal برای متدهای همان کلاس و کلاسی که از آن مشتق شده و در اسمبلی مربوطه

قرار دارند، نمایان است.

بخشی از واسط عمومی کلاس هستند. آنها نحوهی رفتار کلاس را تعریف public متدهای

میکنند.

برای انجام کاری استفاده public متدهای کمکی هستند که توسط متدهای private متدهای

میشوند. چون کار داخل کلاس خصوصی است، نیاز نیست متدهای کمکی به

کلاسهای دیگر نمایان باشند.

1 Restrictions

فصل چهار-برنامه نویسی شی گرا

91

توجه: اگر چند معرف دسترسی در چندین سطح روی یک عنصری اعمال شوند، محدودترین آنها در نظر

گرفته میشود.

اعلان میشوند تا هر کلاس دیگر بتواند از آن استفاده کند. public هر دوو متد Time کلاس ()DisplayCurrentTime

2- باشد، در این حالت متدهای مربوط به کلاسهای دیگر نمیتوانند آنرا احضار کنند. در مثال 6 private اگر متد مورد نظر

احضار شده است. این عمل معقول است، چون کلاس Tester از طریق یک متد کلاسمتد ()DisplayCurrentTime

علامتگذاری شدهاند. public هر دو بصورت DisplayCurrentTime و متد Time

-2-5 آرگومانهای متد

رفتار یک کلاس با متدهای آن کلاس تعریف میشود. برای انعطافپذیر کردن متدها، میتوانید پارامترهایی را تعریف کنید.

پارامترها اطلاعاتی هستند که هنگام احضار متد به آن ارسال میشوند. پس به جای تعریف متدهای مختلف برای مرتبسازی

پارامتری تعریف کنید که نوع عمل مرتبسازی را به آن ارسال ()Sort میتوانید در متد ،ListBox صعودی و نزولی یک

کند.

متدها میتوانند هر تعداد پارامتر دریافت کنند. لیست پارامتر به دنبال نام متد در داخل پارانتز قرار میگیرد. نوع هر پارامتر

بر void تعریف میکند که مقدار ()MyMethod قبل از نام آن پارامتر تعیین میشود. برای مثال، اعلان زیر یک متد به نام

میگرداند و دو پارامتر میگیرد.

void MyMethod (int firstParam, Button secondParam)

{

// ...

}

2 نحوهی ارسال مقادیر به یک متد را نشان میدهد. - در بدنهی متد، پارامترها همانند متغیرهای محلی عمل میکنند. مثال 5

2- مثال 5

using System;

public class MyClass

{

public void SomeMethod( int firstParam, float secondParam )

{

Console.WriteLine("Here are the parameters received: {٠}, {١}",firstParam,

secondParam );

}

}

public class Tester

{

static void Main( )

{

int howManyPeople = ۵;

float pi = ٣٫١۴f;

MyClass mc = new MyClass( );

mc.SomeMethod( howManyPeople, pi );

}

}

خروجی آن به صورت زیر است:

Here are the parameters received 5،3,14

ایجاد و مقداردهی اولیه میشوند. این متغیرها به pi و howManyPeople دو متغیر محلیدر متد فراخوانیکننده (Main)

را به pi و firstParam را به howManyPeople ارسال میشوند. کامپایلر متغیرعنوان پارامترهایی به SomeMethod

نگاشت میکند. secondParam

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

92

-3-5 سازندهها

است. ()Time شبیه احضار متد Time 1 دستور ایجاد شیئی از نوع - توجه کنید که در مثال 6

Time timeObject = new Time( );

در واقع در زمان نمونهسازی یک شی، یک متد احضار میشود، این متد سازنده نامیده میشود. زمان تعریف یک کلاس،

تعریف سازندهی آن دلخواه است. اما اگر این کار را انجام ندهید، کامپایلر یک سازندهی پنهان و اتوماتیک فراهم خواهد کرد.

کار سازنده، ایجاد یک نمونه از کلاس و قرار دادن آن در یک حالت معتبر است. قبل از اجرای سازنده، شی بصورت یک حباب

حافظه است، بعد از اجرای سازنده، حافظه یک نمونهی معتبر از کلاس را نگه میدارد.

سازنده تعریف نمیکند، پس کامپایلر به طور اتوماتیک آن را ایجاد میکند. سازندهی فراهم شده ،Time 2 کلاس - در مثال 5

توسط کامپایلر فقط شی را ایجاد میکند و هیچ کاری انجام نمیدهد. هر سازندهای که آرگومانی ندارد، سازندهی پیش فرض

است. سازندهی فراهم شده توسط کامپایلر هیچ آرگومانی ندارد.

2 - اگر شما متغیرهای عضو را به طور صریح مقداردهی اولیه نکنید، آنها به مقادیر بیضرر مقداردهی اولیه میشوند. جدول 5

مقادیر پیشفرض تخصیص یافته به انواع دادهی مختلف را لیست میکند.

2- جدول 5

نوع داده مقدار پیش فرض

عددی صفر

flase bool

null \0 char

0 Enum

null Refrence

معمولا شما سازندهی کلاستان را تعریف و آرگومانهای آن را فراهم خواهید کرد تا سازنده بتواند حالت اولیهی شی را تنظیم

3 می توانید برای ایجاد یک شی با دادهی بامعنی، مقادیر سال، ماه و روز جاری را به سازنده ارسال کنید. - کند. در مثال 5

یک سازنده را شبیه هر متد دیگر اعلان کنید به استثناء موارد زیر:

-1 نام سازنده باید هم نام کلاس باشد.

-2 سازنده ها مقدار بازگشتی ندارند.

3 یک - اگر بخواهید آرگومانهایی را به سازنده ارسال کنید، لیست آرگومانها را شبیه هر متد دیگر اعلان کنید. مثال 5

اعلان میکند که 6 آرگومان میپذیرد. Time سازنده برای کلاس

3- مثال 5

using System;

public class Time

{

// private member variables

int year;

int month;

int date;

int hour;

فصل چهار-برنامه نویسی شی گرا

93

int minute;

int second;

// public method

public void DisplayCurrentTime( )

{

System.Console.WriteLine( "{٠}/{١}/{٢} {٣}:{۴}:{۵}", month, date, year, hour,

minute, second );

}

// constructor

public Time( int theYear, int theMonth, int theDate,int theHour, int theMinute,

int theSecond )

{

year = theYear;

month = theMonth;

date = theDate;

hour = theHour;

minute = theMinute;

second = theSecond;

}

}

public class Tester

{

static void Main( )

{

Time timeObject = new Time( ٢٠٠٨, ٨, ١, ٩, ٣۵, ٢٠ );

timeObject.DisplayCurrentTime( );

}

}

خروجی به صورت زیر است:

9:35:20 2008/1/8

در این مثال، سازنده یک دنباله از اعداد صحیح را گرفته و همه متغیرهای عضو را براساس این پارامترها مقداردهی اولیه

میکند.

وجود دارد و مقادیر آن مقداردهی اولیه شدهاند. زمانی که متد Time زمانی که سازنده پایان مییابد، شی

فراخوانی میشود، مقادیر نمایش داده میشوند. اگر متغیر عددی را مقداردهی ()Main در ()DisplayCurrentTime

نکنید، توسط کامپایلر به مقدار صفر مقداردهی اولیه میشود. به یاد دارید که انواع دادهی مقداری باید مقداردهی اولیه شده

باشند، در غیر اینصورت سازنده به آنها مقادیر بیضرر میدهد.

-4 مقداردهندههای اولیه 1 -5

مقداردهی اولیه متغیرهای عضو بوسیلهی یک مقدار اولیه دهنده امکانپذیر است. به جای مقداردهی اولیه در سازنده، یک

مقداردهنده اولیه را با تخصیص یک مقدار اولیه به یک عضو کلاس ایجاد میکنید.

Private int second =30 ; //intializer

Time مقدار زمان مهم نیست، اما ثانیهها همواره به مقدار 30 مقداردهی اولیه میشوند. شاید کلاس Time فرض کنید در شی

4را بینید . - را مشخص کند. مثال 5 Second را رونویسی کنید تا یک مقداردهنده اولیه ، مقدار

4- مثال 5

using System;

public class Time

{

// private member variables

1 Initializers

اسلام احمد زاده - 09177112161 - C# برنامه نویسی

94

int year;

int month;

int date;

int hour;

int minute;

int second = ٣٠;

// public method

public void DisplayCurrentTime( )

{

System.Console.WriteLine( "{٠}/{١}/{٢} {٣}:{۴}:{۵}",month, date, year, hour,

minute, second );

}

// constructor

public Time( int theYear, int theMonth, int theDate,int theHour, int theMinute )

{

year = theYear;

month = theMonth;

date = theDate;

hour = theHour;

minute = theMinute;

}

}

public class Tester

{

static void Main( )

{

Time timeObject = new Time( ٢٠٠٨, ٨, ١, ٩, ٣۵ );

timeObject.DisplayCurrentTime( );

}

}

خروجی شبیه زیر است

9:35:30 2008/1/8

اگر مقداردهندهی اولیه را فراهم نکنید، سازنده هر متغیر صحیح را به صفر مقداردهی اولیه می کند. در حالت بالا، عضو

به 30 مقدار دهی اولیه می شود. Second

Second در بخش بعدی خواهیم دید که میتوانید بیش از یک سازنده داشته باشید. اگر بخواهید در بیش از یک مورد از آنها

را به 30 مقداردهی اولیه کنید، به جای مقداردهی اولیه جداگانه در هر سازنده، استفاده از مقدار دهنده اولیه بهترین راه

است.

this -5-5 کلمه کلیدی

یک پارامتر پنهان در هر متد غیرایستای یک this به نمونه جاری از یک شی ارجاع میکند. ارجاع this کلمه کلیدی

به سه روش استفاده میشود: روش اول برای تمایز this کلاس است( متدهای ایستا بعدا بررسی میشوند). معمولا ارجاع

پارامترهای هم نام با اعضای نمونهی کلاس است.

public void SomeMethod (int hour)

{

this.hour = hour;

}

برای حل این ابهام بکار برده this یک پارامتر هم نام عضوی از کلاس میگیرد. ارجاعدر این مثال متد SomeMethod

به پارامتر ارجاع میکند. hour به متغیر عضو و this.hour . میشود

را برای انتساب صریح بکار برید. this می توانید ارجاع

فصل چهار-برنامه نویسی شی گرا

95

public void SetTime(year, month, date, newHour, newMinute, newSecond)

{

this.year = year; // use of "this" required

this.month = month; // required

this.date = date; // required

this.hour = hour; // use of "this" optional

this.minute = newMinute; // optional

second = newSecond; // also ok

}

ضروری ____________است، در غیر اینصورت اختیاری this در صورتی که یک پارامتر با عضوی از کلاس هم نام باشد، استفاده از

میباشد.

برای ارسال شی جاری به عنوان پارامتر به متد دیگری میباشد. به عنوان مثال : this کاربرد دوم ارجاع

Class SomeClass

{

public void FirstMethod(OtherClass otherObject)

{

otherObject.SecondMethod(this);

}

// ...

}

و FirstMethod یک متد بنام OtherClass. SomeClass و SomeClass : این قطعه کد دو کلاس را بنا مینهد

را احضار کرده و شی جاری SecondMethod متد ،FirstMethod دارد. متدیک متد بنام OtherClass SomeMethod

را به عنوان پارامتر به آن ارسال میکند. this را برای پردازش بعدی به آن ارسال میکند. برای این کار، ارجاع

ها است . indexer در this کاربرد دیگر

-6-5 اعضای نمونه و ایستا

فیلدها، خصوصیات و متدهای یک کلاس میتوانند اعضای نمونه 1 یا اعضا ایستا 2 باشند. اعضای نمونه به نمونههای یک نوع

داده اختصاص داده میشوند، در حالیکه اعضای ایستا به کلاسی اختصاص داده میشوند و به نمونه خاصی از کلاس اختصاص

با آنها بکار static داده نمیشوند. متدها بطور پیش فرض متدهای نمونه هستند، مگر اینکه به طور واضع کلمهی کلیدی

برده شود.

اکثریت متدها، متدهای نمونه خواهند بود. متد نمونه بدین معنی است که یک عمل روی یک شی خاصی رخ میدهد. در حال

حاضر به منظور توانایی احضار یک متد بدون داشتن یک نمونه از آن مناسب است که متد ایستا تعریف کنید.

دارید و Button بعد از اعلان یک کلاس، دسترسی به عضو ایستای آن ممکن است. برای مثال، فرض کنید یک کلاس بنام

را دارید. bthDelete و btnUpdate اشیای معرفی شده از این کلاس به نام های

()Draw دارد. کار متد ()GetButtonCount و یک متد ایستا به نام ()Draw یک متد نمونه بنام Button فرض کنید کلاس

برگرداندن تعداد دکمههای قابل رویت روی فرم است. GetButtonCount ترسیم دکمه جاری است و کار متد

دسترسی به یک متد نمونه از طریق یک نمونه از آن شی انجام میشود.

btnUpdate.SomeMethod( );

یک متد ایستا از طریق نام کلاس نه نام یک نمونه دستیابی میشود.

Button.GetButtonCount( );

1 Instance

2 Static

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

96

-1-6 احضار متدهای ایستا -5

را بکار برند، this متدهای ایستا به جای یک نمونه از کلاس روی یک کلاس عمل میکنند. آنها نمیتوانند کلمهی کلیدی

چون هیچ شی جاری در کار نیست.

یک متد ایستا ()Main متدهای ایستا نمیتوانند مستقیما به اعضای غیرایستا دسترسی داشته باشند. به خاطر دارید که

بخواهد به متد غیر ایستای هر کلاسی دسترسی داشته باشد، باید یک نمونه از آن کلاس را معرفی کند. ()Main است. اگر

یک VS.NET . ایجاد کنید StaticTester 2005 را استفاده کرده و یک برنامه کاربردی کنسولی بنام vs برای مثال بعدی

تغییر نام دهید و همه Tester 1 را به Class . 1 ایجاد میکند Class و یک کلاس به نامفضای نامی StaticTester

را از متد args قرار میدهد حذف کنید. پارامتر ()Main در بالای VS NET را کهتوضیحات و صفت [STATThread]

حذف کنید. بعد از این کارها، کد شما به صورت زیر میباشد: ()Main

using System;

namespace StaticTester

{

class Tester

{

static void Main( )

{

}

}

}

()Run انجام میشد، اما حالا یک متد نمونه بنام ()Main آن نقطه شروع خوبی است. تا به حال، همه کارهای برنامه در متد

انجام خواهد شد. ()Run ایجاد خواهیم کرد. کار برنامه در متد

را نوشته و به public معرف دسترسی ،Run را در داخل کلاس اعلان کنید. در اعلان متدمتد نمونه جدید به نام ()Run

دنبال آن نوع مقدار بازگشتی، شناسه و سپس پرانتزها را بنویسید.

public void Run( )

هیچ پارامتری ندارد. پس میتوانید پرانتز ها را خالی رها کنید. آکولادها ()Run پرانتزها، پارامترها را نگه خواهند داشت، اما

روی کنسول را بنویسید. "Hello world" را برای متد باز کرده و دستور چاپ

public void Run( )

{

Console.WriteLine("Hello world");

}

را احضار کند. بنابراین یک نمونه ()Run یک متد ایستا است. پس نمیتواند مستقیما ( )Main یک متد نمونه است و ( )Run

را روی آن نمونه فراخوانی خواهید کرد. ()Run را ایجاد خواهید کرد و Tester از کلاس

;( )Tester t=new Tester

1- شکل 5

فصل چهار-برنامه نویسی شی گرا

97

را تایپ میکنید، سیستم هوشمند 1 سعی میکند با نام کلاس به شما کمک کند. در خط بعدی متدزمانی که کلمه کلیدی new

سیستم هوشمند لیست متدهای ،t احضار کنید. هنگام تایپ عملگر نقطه بعد از Tester از کلاس t ر ا روی شی ( )Run

را نمایش میدهد. Tester کلاس

5 خواهد شد. - زمانی که برنامه شما کامل شد، شبیه مثال 5

5- مثال 5

using System;

namespace StaticTester

{

// create the class

class Tester

{

// Run is an instance method

public void Run( )

{

Console.WriteLine( "Hello world" );

}

// Main is static

static void Main( )

{

// create an instance

Tester t = new Tester( );

// invoke the instance method

t.Run( );

}

}

}

خروجی به صورت زیر است:

Hello world

به معرفی یک شی محدود میشود و سپس متد ()Main این مدل را در بیشتر برنامه های کنسولی بکار خواهید برد. متد

را احضار میکند. ()Run

1 Intellisense

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

98

-2-6 کاربرد فیلدهای ایستا -5

یک کاربرد عمومی متغیرها یا فیلدهای ایستا، نگهداری تعداد نمونههای جاری موجود از یک کلاس است. در مثال بعدی، یک

را برای شبیهسازی یک فروشگاه حیوانات اهلی ایجاد خواهید کرد. Cat شی از کلاس

6 نشان داده میشود. - آمده است. لیست کامل برنامه در مثال 5 Cat در این مثال، فقط خصوصیات ضروری کلاس

6- مثال 5

using System;

namespace Test

{

// declare a Cat class

// stripped down

public class Cat

{

// a private static member to keep

// track of how many Cat objects have

// been created

private static int instances = ٠;

private int weight;

private String name;

// cat constructor

// increments the count of Cats

public Cat( String name, int weight )

{

instances++;

this.name = name;

this.weight = weight;

}

// Static method to retrieve

// the current number of Cats

public static void HowManyCats( )

{

Console.WriteLine( "{٠} cats adopted", instances );

}

public void TellWeight( )

{

Console.WriteLine( "{٠} is {١} pounds", name, weight );

}

}

class Tester

{

public void Run( )

{

Cat.HowManyCats( );

Cat frisky = new Cat( "Frisky", ۵ );

frisky.TellWeight( );

Cat.HowManyCats( );

Cat whiskers = new Cat( "Whisky", ٧ );

whiskers.TellWeight( );

Cat.HowManyCats( );

}

static void Main( )

{

Tester t = new Tester( );

t.Run( );

}

}

}

خروجی :

فصل چهار-برنامه نویسی شی گرا

99

٠ cats adopted

Frisky is ۵ pounds

١ cats adopted

Whisky is ٧ pounds

٢ cats adopted

شروع میشود، که با صفر مقداردهی اولیه میشود. این فیلد ایستا instances با تعریف یک فیلد ایستا بنام Cat کلاس

ایجاد شده را نگه میدارد. هر زمان که سازنده اجرا میشود، مقدار آن یک واحد افزایش مییابد. Cat تعداد اشیاء

را پیگیری Cat این دو فیلد نام و وزن تک به تک اشیاء .name , weight : دو فیلد نمونه تعریف میکند Cat کلاس

میکنند.

ایستا است. تعدادگربهها ()HowManyCats تعریف میکند. متد ()TellWeight() ,HowManyCats دو متد Cat کلاس

یک متد نمونه است، چون هر ()TellWeight یک خصوصیت از یک گربه نیست. آن یک خصوصیت از کل کلاس است. متد

دستیابی میکند. HowManyCats مستقیما به متد Cat از طریق کلاس ( )Main گربه نام و وزن خودش را دارد. متد

Cat.HowManyCats( );

دستیابی میکند. ()TellWeight به متد نمونه Cat ایجاد میکند و از طریق نمونهی Cat یک نمونه از ()Main سپس

Cat frisky = new Cat( )

frisky.TellWeight( );

افزایش گربه ها را گزارش میدهد. ()HowManyCats . ایجاد میشود Cat هر زمانی که یک نمونه از کلاس

-7-5 خراب کردن اشیاء

و پاسکال )، جمع آوری زباله را فراهم میکند. بعد از کار بر روی اشیاء، (++c,c برخلاف بیشتر زبانهای برنامهنویسی #C

آنها بطور اتوماتیک خراب میشوند و نیازی نیست نگران پاکشدن اشیاء باشید. مگر اینکه منابع مدیریتنشده یا نادر 1

استفاده کرده باشید. یک منبع نادر، منبعی است که شما تعداد کمتری از آنرا در اختیار دارید ( مانند اتصالات به پایگاه داده

.(

در صورت استفاده از یک منبع مدیریتنشده، باید به طور صریح آنرا آزاد کنید. کنترل صریح روی این منبع با یک مخرب

فراهم میشود که در حین خراب کردن شی به وسیله جمعکنندهی زباله فراخوانی میشود.

اعلان کنید. ˜ را با علامت #C مخرب

˜{ } MyClass

این گرامر توسط کامپایلر به صورت زیر ترجمه میشود.

protected override void Finalize()

{

try

{

// do work here

}

finally

{

base.Finalize();

}

}

1 Scarce

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

100

بدین دلیل بعضی از برنامهنویسان، مخرب را همانند یک تمامکننده 1 میدانند. فراخوانی صریح یک مخرب نامعقول است.

مخرب به وسیله جمعکننده زباله فراخوانی خواهد شد. اگر میخواهید خراب کردن منابع مدیریت نشدهای را اداره کنید،

پیادهسازی کنید که به Dispose را پیادهسازی کنید. بدین منظور لازم است یک متد به نامشما باید واسط IDisposable

وسیله سرویسگیرندهها فراخوانی خواهد شد.

باید جمعکنندهی زباله را از فراخوانی مخرب شی متوقف سازید. برای ()Dispose در صورت فراهمکردن یک متد

را به عنوان پارامتر this را فراخوانی کنید و ()GC.SuppressFinalize متوقفکردن جمعکنندهی زباله متد ایستای

شما را فراخوانی کند، احتمالا می نویسید: ()Dispose به آن ارسال کنید. پس مخرب شی میتواند متد

using System;

class Testing : IDisposable

{

bool is_disposed = false;

protected virtual void Dispose( bool disposing )

{

if ( !is_disposed ) // only dispose once!

{

if ( disposing )

{

Console.WriteLine( "Not in destructor,

OK to reference other objects" );

}

// perform cleanup for this object

Console.WriteLine( "Disposing..." );

}

this.is_disposed = true;

}

public void Dispose( )

{

Dispose( true );

// tell the GC not to finalize

GC.SuppressFinalize( this );

}

~Testing( )

{

Dispose( false );

Console.WriteLine( "In destructor." );

}

}

خصوصی و یک ()Dispose را فراخوانی میکنند. میتوانید یک متد ()Close در بعضی از اشیاء، سرویس گیرنده ها متد

را احضار کنید. ()Dispose متد ()Close ایجاد کنید و در متد ()Close متد عمومی

برای using یک دستور #C ، توسط کاربر برنامه و اتمام غیرقطعی برنامه ()Dispose به دلیل عدم اطمینان از فراخوانی

در نزدیکترین زمان ممکن فراهم میکند. برای اشیایی که به کار میبرید، برای آنها دراطمینان از فراخوانی ()Dispose

به طور اتوماتیک روی آن شی ()Dispose بین آکولادها یک میدان ایجاد میکنید. زمانی که به آکولاد بسته رسیدیم، متد

فراخوانی خواهد شد. همانطور که در اینجا میبینید :

using System.Drawing;

class Tester

{

public static void Main( )

{

using (Font theFont = new Font("Arial", ١٠٫٠f))

{

// use the font

}

1 Finalizer

فصل چهار-برنامه نویسی شی گرا

101

}

}

را مجاز میدارد، ما میخواهیم در نزدیکترین فرصت آن را از بین ببریم. در این Font چون ویندوز فقط تعداد کمی از اشیاء

روی ()Dispose پایان مییابد، فراخوانی using ایجاد میشود. زمانی که دستور using با دستور Font قطعه کد، شی

تضمین میشود. ()Font شی

-8-5 تخصیص حافظه

اشیاء ایجاد شده در متدها، متغیرهای محلی خوانده میشوند. آنها در متد به صورت محلی هستند. شی ایجاد شده در متد،

در همان متد استفاده میشود و در زمان پایان متد خراب میشود. اشیاء محلی، بخشی از حالت شی نیستند، آنها مقادیر

موقت را نگه میدارند.

ایجاد میشوند. زمانی که متدها احضار Stack روی بخشی از حافظه بنام int متغیرهای محلی انواع داده اصلی، همچون

به پارامترها و متغیرهای محلی آنها حافظه تخصیص داده میشود و در انتهای متد آزاد میشود. Stack میشوند،در روی

ایجاد میشوند. زمانی که متد پایان مییابد، متغیرهای Stack زمانی که یک متد شروع میشود، همه متغیر های محلی روی

محلی خراب میشوند.

این متغیرها، محلی بیان میشوند، چون فقط در طول زندگی متد وجود دارند (یعنی میدان محلی دارند). زمانی که متد پایان

مییابد، متغیر از میدان بیرون رفته و خراب میشود.

ایجاد میشوند. همه انواع Stack انواع دادهها را به دو گروه مقداری و ارجاعی تقسیم میکند. انواع دادهی مقداری روی #C

ایجاد میشوند. Stack انواع داده مقداری هستند و روی (long , int) داده اصلی

ایجاد میشوند. Heap کلاسها انواع دادهی ارجاعی هستند. انواع داده ارجاعی روی یک بلاک مشتق شده از حافظه بنام

زمانی که یک نمونه از نوع داده ارجاعی اعلان میکنید، در واقع یک متغیر به یک شی دیگر اشاره میکند. ارجاع، همانند

یک نام مستعار برای شی عمل میکند. پس زمانیکه شما مینویسید:

;( )Dog milo=new Dog

انتساب داده milo ایجاد میکند و یک ارجاع به آن بر میگرداند. آن ارجاع به Heap روی Dog یک شی new عملکرد

اشاره میکند. اما از نظر تکنیکی آن نادرست Heap روی Dog یک شی ارجاعی است که به یک شی milo میشود. بنابراین

همانند milo اشاره میکند. ارجاع Heap بدون نام ) روی ) Dog یک شی ارجاعی است که به یک شی milo است. در واقع

برخورد میگردد. Dog همانند خود شی milo یک نام مستعار برای شی بدون نام عمل میکند. در اهداف عملی با

مفهوم کاربرد ارجاعها این است که میتوانید به یک شی چندین ارجاع داشته باشید. برای فهم تفاوت ما بین انواع داده

7 را بررسی کنید. تحلیل کامل به دنبال مثال میآید. - مقداری و ارجاعی مثال 5

7- مثال 5

using System;

namespace heap

{

public class Dog

{

public int weight;

}

class Tester

{

public void Run( )

{

// create an integer

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

102

int firstInt = ۵;

// create a second integer

int secondInt = firstInt;

// display the two integers

Console.WriteLine( "firstInt: {٠} secondInt: {١}",firstInt, secondInt );

// modify the second integer

secondInt = ٧;

// display the two integers

Console.WriteLine( "firstInt: {٠} secondInt: {١}",firstInt, secondInt );

// create a dog

Dog milo = new Dog( );

// assign a value to weight

milo.weight = ۵;

// create a second reference to the dog

Dog fido = milo;

// display their values

Console.WriteLine( "Milo: {٠}, fido: {١}",milo.weight, fido.weight );

// assign a new weight to the second reference

fido.weight = ٧;

// display the two values

Console.WriteLine( "Milo: {٠}, fido: {١}",milo.weight, fido.weight );

}

static void Main( )

{

Tester t = new Tester( );

t.Run( );

}

}

}

خروجی به صورت زیر است:

firstInt: ۵ secondInt: ۵

firstInt: ۵ secondInt: ٧

Milo: ۵, fido: ۵

Milo: ٧, fido: ٧

را ایجاد و secondInt و مقداردهی آن به 5 آغاز میشود. متغیر دوم بنام firstInt برنامه با ایجاد یک متغیر صحیح بنام

مقداردهی میکند. مقادیر آنها در خروجی به صورت زیر نمایش داده میشوند: firstInt با

firstInt: ۵ secondInt: ۵

2- شکل 5

ساخته و به firstInt یک نوع دادهی مقداری است که یک کپی از مقدار int این مقادیر یکسان هستند. چون

یک متغیر مستقل است. secondInt 2 نشان میدهد، متغیر - انتساب میدهد. همانطور که شکل 5 secondInt

انتساب میدهد . secondInt سپس برنامه یک مقدار جدید به

secondInt = ٧;

چون این متغیرها از نوع مقداری بوده و مستقل از بقیه هستند،. پس متغیر اول را تحت تاثیر قرار نمیدهد و فقط کپی آن

تغییر داده میشود.

3- شکل 5

فصل چهار-برنامه نویسی شی گرا

103

زمانی که دادهها نمایش داده میشوند، مقادیر آنها متفاوت هستند.

firstInt: ۵ secondInt: ٧

بوده و هر متد از هر public است. این فیلد weight با فقط یک فیلد بنام Dog گام بعدی ایجاد یک کلاس ساده بنام

ذخیره میکنید. milo را معرفی کرده و یک ارجاع به آن در Dog کلاسی میتواند به آن دسترسی داشته باشد. شما یک شی

Dog milo = new Dog( );

انتساب دهید. milo مقدار 5 را به فیلد وزن

milo.weight = ۵;

به milo که heap مقدار 5 قرار داده شده است. اما در واقع وزن شی بدون نام روی milo بطور معمول گفته میشود، وزن

4 نشان داده شده است . - آن ارجاع میکند مقداردهی شده است. همانطور که در شکل 5

4- شکل 5

مقداردهی کنید. این عمل ارجاع جدیدی به آن شی روی milo ایجاد کرده و آنرا با Dog در گام بعدی ارجاع دیگری به

ایجاد میکند. heap

Dog fido = milo;

و مقدار دهی اولیه آن میباشد secondInt توجه کنید که قانون ایجاد این متغیر و مقداردهی اولیهی آن، شبیه ایجاد متغیر

int secondInt = firstInt;

Dog fido = milo;

نیست. آن یک ارجاع به همان شی milo یک کپی از fido یک نوع دادهی ارجاعی است، پسبا این تفاوت که چون Dog

وجود Heap 5 میبینید، در حال حاضر یک شئ با دو ارجاعکننده به آن روی - است. پس همانطور که در شکل 5 milo

را تغییر میدهید . fido دارد. زمانی که وزن شی

fido.weight = ٧;

نیز تغییر مییابد و خروجی زیر منعکس میگردد. milo وزن شی مربوط به

Milo : 7, Fido : 7

milo را تغییر میدهد. پس بطور همزمان مقدار شی Heap را تغییر نمیدهد. آن شی بدون نام روی milo شی ،fido شیء

نیز تغییر مییابد.

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

104

ایجاد Heap روی Dog را بکار ببرید، یک نمونهی جدید از new کلمه کلیدی fido توجه: اگر زمان ایجاد

به شی یکسانی اشاره نمیکنند. milo و fido میکنید و

5- شکل 5

اگر کلاسی نیاز دارید که شبیه نوع داده مقداری رفتار کند، بایستی ساختار 1 ایجاد کنید.

-9-5 خلاصه

، اعلان کرده و سپس متدها، فیلدها، نمایندهها 2 class • زمان تعریف یک کلاس جدید، نام کلاس را با کلمه کلیدی

رویدادها و خصوصیات آن را تعریف کنید.

new • برای معرفی یک شی، همانند یک متغیر محلی نام شی را به دنبال نام کلاس اعلان کنید. سپس کلمهی کلیدی

لازم دارید. Heap را برای تخصیص حافظه به آن شی روی

فراخوانی یک متد روی شی با نوشتن عملگر نقطه بعد از نام شی و نام متد و پارامترهای آن بعد از نقطه امکان پذیر

است.

معرفهای دسترسی نمایان بودن متدها و متغیرهای کلاس را برای کلاسهای دیگر مشخص میکنند. همه اعضای

کلاس برای همه متدهای آن کلاس نمایان هستند.

نشانهگذاری شدهاند، هیچ محدودیتی ندارند و برای هر متد از هر کلاسی نمایان هستند. public • اعضایی که با

فقط به متدهای همان کلاس نمایان هستند. private • اعضای

به متدهای همان کلاس و متدهای کلاس مشتق شده از آن کلاس نمایان هستند. protected • اعضای

سازنده، متد خاصی است که زمان ایجاد شی احضار میشود. اگر سازندهای برای کلاس خود فراهم نکنید، کامپایلر

به طور اتوماتیک این کار را انجام میدهد. سازندهی پیش فرض هیچ پارامتری ندارد.

به نمونهی جاری یک شی اشاره this • زمان تعریف اعضای کلاس میتوانید به آنها مقدار اولیه دهید. کلمه کلیدی

میکند.

به هر متد غیرایستای یک کلاس ارسال میشود. this • یک متغیر صریح

1 Struct

2 Delegate

فصل چهار-برنامه نویسی شی گرا

105

اعضای ایستا به خود کلاس نه به نمونهی خاصی از آن کلاس انتساب داده میشوند. اعضای ایستا با کلمه کلیدی

را بکار نمیبرند، this اعلان میشوند و از طریق نام کلاس احضار میشوند. متدهای ایستا کلمه کلیدی static

چون هیچ نمونهای از کلاس وجود ندارد.

هر شی بدون استفاده را خراب میکند. GC به کمک .NET متد مخرب ضروری نیست، چون چارچوب #C • در

فراهم کنید. ()Dispose • اگر یک کلاس از منابع مدیریت نشده استفاده کند، باید یک متد

ایجاد میشوند. زمانی که متد پایان مییابد، این متغیرها از میدان خارج Stack • متغیرهای محلی نوع مقداری روی

شده و خراب میشوند.

ایجاد میشوند. زمان اعلان یک نمونه از نوع ارجاعی، در واقع یک Heap • اشیاء از نوع دادهی ارجاعی هستند و روی

ایجاد میکنید. اگر این ارجاع را در داخل یک متد اعلان کنید، پس از پایان یافتن Heap اشارهگر به شی موجود در

نمانده باشد، آن شی به Heap متد، ارجاع مورد نظر خراب می شود.در صورتی که هیچ ارجاعی به آن شی روی

خراب میشود. GC وسیله

 

   + MOHSEN GHASEMI - ۱٢:٠٧ ‎ق.ظ ; ۱۳۸٩/٤/٥