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


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

فصل هفدهم برنامه نویسی واسط ها #C

<!-- /* 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-format:other; 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-format:other; 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 4 5 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:"Angsana New"; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:"Cordia New"; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 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:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:8192 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:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:262144 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-format:other; mso-font-pitch:variable; mso-font-signature:12583555 0 0 0 13 0;} @font-face {font-family:Vrinda; panose-1:1 1 6 0 1 1 1 1 1 1; 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:Raavi; panose-1:2 0 5 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:Shruti; panose-1:2 0 5 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: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:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 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:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 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:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 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:Cambria; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1073741899 0 0 159 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 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:1627400839 -2147483648 8 0 66047 0;} @font-face {font-family:"Segoe UI"; panose-1:2 11 5 2 4 2 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-536861953 -1073733541 9 0 479 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin-top:0cm; margin-right:0cm; margin-bottom:10.0pt; margin-left:0cm; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} h1 {mso-style-priority:5; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 1 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:1; font-size:15.0pt; mso-bidi-font-size:18.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; mso-font-kerning:0pt; font-weight:bold;} h2 {mso-style-priority:6; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 2 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:2; font-size:13.0pt; mso-bidi-font-size:16.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} h3 {mso-style-priority:7; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 3 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:3; font-size:11.0pt; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} h4 {mso-style-priority:8; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 4 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:4; font-size:11.0pt; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:normal;} h5 {mso-style-priority:9; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 5 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:5; font-size:11.0pt; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:normal; font-style:italic;} h6 {mso-style-priority:10; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 6 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:6; font-size:10.0pt; mso-bidi-font-size:13.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} p {mso-style-priority:1; mso-style-unhide:no; margin-top:0cm; margin-right:0cm; margin-bottom:10.0pt; margin-left:0cm; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.MsoAcetate, li.MsoAcetate, div.MsoAcetate {mso-style-noshow:yes; mso-style-priority:99; mso-style-unhide:no; mso-style-link:"Balloon Text Char"; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:8.0pt; font-family:"Tahoma","sans-serif"; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast;} span.MsoPlaceholderText {mso-style-noshow:yes; mso-style-priority:99; mso-style-unhide:no; color:gray;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; margin-top:0cm; margin-right:0cm; margin-bottom:10.0pt; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; margin-bottom:.0001pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; margin-bottom:.0001pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:10.0pt; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.MsoQuote, li.MsoQuote, div.MsoQuote {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Quote Char"; mso-style-next:Normal; margin-top:0cm; margin-right:36.0pt; margin-bottom:10.0pt; margin-left:36.0pt; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi; color:black; mso-themecolor:text1;} span.Heading1Char {mso-style-name:"Heading 1 Char"; mso-style-priority:5; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 1"; mso-ansi-font-size:15.0pt; mso-bidi-font-size:18.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} span.Heading2Char {mso-style-name:"Heading 2 Char"; mso-style-priority:6; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 2"; mso-ansi-font-size:13.0pt; mso-bidi-font-size:16.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} span.Heading3Char {mso-style-name:"Heading 3 Char"; mso-style-priority:7; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 3"; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} span.Heading4Char {mso-style-name:"Heading 4 Char"; mso-style-priority:8; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 4"; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191;} span.Heading5Char {mso-style-name:"Heading 5 Char"; mso-style-priority:9; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 5"; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-style:italic;} span.Heading6Char {mso-style-name:"Heading 6 Char"; mso-style-priority:10; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 6"; mso-ansi-font-size:10.0pt; mso-bidi-font-size:13.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} p.Publishwithline, li.Publishwithline, div.Publishwithline {mso-style-name:"Publish with line"; mso-style-noshow:yes; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:16.0pt; mso-bidi-font-size:19.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} p.PublishStatus, li.PublishStatus, div.PublishStatus {mso-style-name:"Publish Status"; mso-style-noshow:yes; mso-style-unhide:no; margin-top:6.0pt; margin-right:0cm; margin-bottom:2.0pt; margin-left:0cm; mso-pagination:widow-orphan; background:#FDEB9F; border:none; mso-border-alt:solid #FDBD5E .5pt; padding:0cm; mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt; font-size:9.0pt; mso-bidi-font-size:13.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.PublishStatusAccessible, li.PublishStatusAccessible, div.PublishStatusAccessible {mso-style-name:PublishStatus_Accessible; mso-style-noshow:yes; mso-style-unhide:no; margin-top:6.0pt; margin-right:0cm; margin-bottom:2.0pt; margin-left:0cm; mso-pagination:widow-orphan; border:none; mso-border-alt:solid #FDBD5E .5pt; padding:0cm; mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt; font-size:9.0pt; mso-bidi-font-size:13.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.Account, li.Account, div.Account {mso-style-name:Account; mso-style-noshow:yes; mso-style-unhide:no; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:3.6pt 63.35pt; font-size:9.0pt; mso-bidi-font-size:12.0pt; font-family:"Segoe UI","sans-serif"; mso-fareast-font-family:"Segoe UI"; color:#4F81BD;} p.Categories, li.Categories, div.Categories {mso-style-name:Categories; mso-style-noshow:yes; mso-style-unhide:no; mso-style-parent:Account; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:3.6pt 63.35pt; font-size:9.0pt; mso-bidi-font-size:12.0pt; font-family:"Segoe UI","sans-serif"; mso-fareast-font-family:"Segoe UI"; color:#4F81BD;} p.PadderBetweenTitleandProperties, li.PadderBetweenTitleandProperties, div.PadderBetweenTitleandProperties {mso-style-name:"Padder Between Title and Properties"; mso-style-noshow:yes; mso-style-unhide:no; margin-top:0cm; margin-right:0cm; margin-bottom:1.0pt; margin-left:0cm; mso-pagination:widow-orphan; font-size:1.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.PadderBetweenControlandBody, li.PadderBetweenControlandBody, div.PadderBetweenControlandBody {mso-style-name:"Padder Between Control and Body"; mso-style-noshow:yes; mso-style-unhide:no; mso-style-next:Normal; margin-top:0cm; margin-right:0cm; margin-bottom:6.0pt; margin-left:0cm; mso-pagination:widow-orphan; font-size:1.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.underline, li.underline, div.underline {mso-style-name:underline; mso-style-noshow:yes; mso-style-unhide:no; mso-style-parent:""; margin-top:2.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; border:none; mso-border-bottom-alt:solid #4F81BD 1.0pt; mso-border-bottom-themecolor:accent1; padding:0cm; mso-padding-alt:0cm 0cm 2.0pt 0cm; font-size:1.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} span.QuoteChar {mso-style-name:"Quote Char"; mso-style-priority:1; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:Quote; color:black; mso-themecolor:text1;} span.BalloonTextChar {mso-style-name:"Balloon Text Char"; mso-style-noshow:yes; mso-style-priority:99; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Balloon Text"; mso-ansi-font-size:8.0pt; mso-bidi-font-size:8.0pt; font-family:"Tahoma","sans-serif"; mso-ascii-font-family:Tahoma; mso-hansi-font-family:Tahoma; mso-bidi-font-family:Tahoma;} span.msoIns {mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single; color:teal;} span.msoDel {mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:red;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-bidi-font-size:10.0pt; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} .MsoPapDefault {mso-style-type:export-only; margin-bottom:10.0pt;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 72.0pt 72.0pt 72.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

 

 فصل هفدهم

C#برنامه نویسی  واسط ها

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

مفهوم واسط و تاثیر آن در کدنویسی

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

استفاده از واسط ها برای ارث بری چندگانه

توسعه و ترکیب واسط های موجود

استفاده از واسط برای تشخیص قابلیت های یک کلاس

is و as − کاربرد عملگرهای

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

یک کلاس، واسطی را پیاده سازی می کند، آن می گوید من تضمین م یکنم که متدها، خصوصیات، رویدادها و اندی سگذارهای

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

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

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

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

زمانی که یک واسط را تعریف می کنید، ممکن است متدها، خصوصیات، اندیس گذارها یا رویدادهایی تعریف کنید که

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

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

واسط ها برای ترکیب شدن با درخ تهای وراثت درگیر هستند.

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

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

کاربرد فیلدهای ثابت در واس طها را پشتیبانی نم یکند، ولی م یتوان از ثاب تهای شمارشی استفاده C # ، نکته: برخلاف جاوا

کرد.

1 Interface

فصل هفدهم واسط ها

297

را پیاده سازی می کند. پیاده سازی یک واسط، یک is-a در فصل های قبلی دیدیم که وراثت از یک کلاس انتزاعی، رابط هی

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

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

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

ترکیب و توسعه واس طها را یاد می گیرید.

-1-17 تعریف و پیاده سازی یک واسط

گرامر تعریف یک واسط بصورت زیر است.

[attributes] [access-modifier] interface interface-name[:baselist]{

interface-body}

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

با نام واسط interface هستند. کلمه ی کلیدی protected internal و,protected, private, public

شروع می شود. I دنبال می شود. معمولاً، نام واسط با حرف بزرگ

واس طهایی که این واسط بسط می دهد را لیست م یکند. ،Base-list

متدها، خصوصیات و آنچه که باید توسط کلاس پیاد هسازی کننده، پیاد هسازی شود را شرح می دهد. :Interface-body

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

بنامید. IStorable داده یا هر ساختار دیگر همچون فایل را توصیف کند و تصمیم دارید آن را

ظاهر می گردد. Interface-body را مشخص می کنید که در ()Read(),Write احتمالاً در این واسط دو متد

interface IStorable

{

void Read();

void Write(object);

}

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

بتواند در یک پایگاه داده Document ایجاد کنید و نوع داده ی Document مثال: ممکن است بخواهید یک کلاس بنام

پیاده سازی کنید. Document را در IStorable ذخیره شود. سپس تصمیم دارید واسط

ارث بری می کند. IStorable از واسط Document برای انجام این کار، همان گرامر ار ثبری را بکار برید که کلاس جدید

public class Document : IStorable

{

public void Read() {...}

public void Write(object obj) {...}

// ...

}

فراهم IStorable مسئول هستید یک پیاده سازی معنی دار از متدهای Document حال شما به عنوان نویسنده کلاس

را IStorable شما باید هم هی متدهای ،IStorable به عنوان پیاده سازی کننده ی Document کنید. با معین کردن

را IStorable واسط Document 1، کلاس - پیاده سازی کنید وگرنه در زمان کامپایل با خطا مواجه خواهید شد. در مثال 17

پیاده سازی می کند.

1- مثال 17

#region Using directives

using System;

using System.Collections.Generic;

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

298

using System.Text;

#endregion

namespace SimpleInterface

{

// declare the interface

interface IStorable

{

// no access modifiers, methods are public

// no implementation

void Read( );

void Write( object obj );

int Status { get; set; }

}

// create a class which implements the IStorable interface

public class Document : IStorable

{

// store the value for the property

private int status = ٠;

public Document( string s )

{

Console.WriteLine( "Creating document with: {٠}", s );

}

// implement the Read method

public void Read( )

{

Console.WriteLine(

"Implementing the Read Method for IStorable" );

}

// implement the Write method

public void Write( object o )

{

Console.WriteLine(

"Implementing the Write Method for IStorable" );

}

// implement the property

public int Status

{

get

{

return status;

}

set

{

status = value;

}

}

}

// Take our interface out for a spin

public class Tester

{

static void Main( )

{

// access the methods in the Document object

Document doc = new Document( "Test Document" );

doc.Status = -١;

doc.Read( );

Console.WriteLine( "Document Status: {٠}", doc.Status );

}

}

}

Output:

Creating document with: Test Document

Implementing the Read Method for IStorable

Document Status: -١

فصل هفدهم واسط ها

299

بنام integer و یک خصوصیت از نوع ()Write و()Read با دو متد IStorable 1 یک واسط ساده بنام - مثال 17

فراهم نمی کند، اما ()set و ()get را تعریف می کند. توجه داشته باشید که اعلان خصوصیت، یک پیاده سازی برای Status

بطور ساده مشخص می کند که این متدها وجود دارند.

{; int Status {get ; set

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

هستند، چون واسط قراردادی است که بوسیله ی کلاس های دیگر public کامپایل تولید می کند. متدهای واسط مطلقاً

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

ایجاد کنید.

باید هر دو Document . کلاسی که واسط را پیاده سازی م یکند، باید قرارداد را بطور کامل و دقیق پیاد هسازی کند

چگونه این نیازمند یها را تکمیل Document را فراهم کند. اینکه کلاس Status و خصوصیت ()Read و ()Write متد

را دارد. اما آن نمی داند که کلاس Status خصوصیت ،IStorable می کند کاملاً به خود کلاس مرتبط است. اگرچه واسط

چگونه آن را ذخیره می کند( به صورت یک متغیر عضو یا یک فیلد در پایگاه داده). جزئیات بر روی پیاده سازی Document

کلاس است.

-1-1-17 پیاده سازی بیش از یک واسط

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

را برای پیاد هسازی انتخاب کنید. برای ICompressible و IStorable می تواند فشرده سازی شود، ممکن است دو واسط

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

کنید.

public class Document : IStorable, ICompressible

را پیاده سازی کند. ICompressible باید متدهای مشخص شده بوسیله ی واسط Document در این صورت کلاس

public void Compress()

{

Console.WriteLine("Implementing the Compress Method");

}

public void Decompress( )

{

Console.WriteLine("Implementing the Decompress Method");

}

-2-1-17 بسط دادن واسط ها

بسط دادن یک واسط موجود برای اضافه کردن متدها یا اعضای جدید یا تغییر نحو هی کار اعضای موجود امکا نپذیر است.

بسط دهید که واسط اصلی را با ILoggedCompressible را با واسط جدید ICompressible برای مثال، ممکن است

متدهایی جهت پی گیری بایت های ذخیره شده بسط م یدهد.

interface ILoggedCompressible : ICompressible

{

void LogSavedBytes();

}

آزاد ICompressible یا IloggedCompressible کلاس ها متناسب با نیاز خود برای پیاده سازی یکی از دو واسط

را پیاده سازی کند، آن باید همه ی متدهای هر دو واسط را پیاده سازی ILoggedCompressible هستند. اگر کلاسی واسط

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

300

قالب بندی ICompressible یا ILoggedCompressible کند. اما اشیاء این نوع داده م یتوانند به یکی از واسط های

شوند.

-3-1-17 ترکیب واسط ها

بطور مشابه، می توانید واسط های جدیدی با ترکیب واسط های موجود و اضافه کردن خصوصیات و متدهای جدید ایجاد کنید.

را تصمیم بگیرید. این واسط متدهای هر دو واسط را همراه یک IStorableCompressible برای مثال، ممکن است ایجاد

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

interface IStorableCompressible : IStorable, ILoggedCompressible

{

void LogOriginalSize();

}

2: بسط دادن و ترکیب واسط ها را نشان می دهد. - مثال 17

2- مثال 17

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

#endregion

namespace ExtendAndCombineInterface

{

interface IStorable

{

void Read( );

void Write( object obj );

int Status { get; set; }

}

// here's the new interface

interface ICompressible

{

void Compress( );

void Decompress( );

}

// Extend the interface

interface ILoggedCompressible : ICompressible

{

void LogSavedBytes( );

}

// Combine Interfaces

interface IStorableCompressible : IStorable, ILoggedCompressible

{

void LogOriginalSize( );

}

// yet another interface

interface IEncryptable

{

void Encrypt( );

void Decrypt( );

}

public class Document : IStorableCompressible, IEncryptable

{

// hold the data for IStorable's Status property

private int status = ٠;

// the document constructor

public Document( string s )

{

Console.WriteLine( "Creating document with: {٠}", s );

}

// implement IStorable

فصل هفدهم واسط ها

301

public void Read( )

{

Console.WriteLine(

"Implementing the Read Method for IStorable" );

}

public void Write( object o )

{

Console.WriteLine(

"Implementing the Write Method for IStorable" );

}

public int Status

{

get

{

return status;

}

set

{

status = value;

}

}

// implement ICompressible

public void Compress( )

{

Console.WriteLine( "Implementing Compress" );

}

public void Decompress( )

{

Console.WriteLine( "Implementing Decompress" );

}

// implement ILoggedCompressible

public void LogSavedBytes( )

{

Console.WriteLine( "Implementing LogSavedBytes" );

}

// implement IStorableCompressible

public void LogOriginalSize( )

{

Console.WriteLine( "Implementing LogOriginalSize" );

}

// implement IEncryptable

public void Encrypt( )

{

Console.WriteLine( "Implementing Encrypt" );

}

public void Decrypt( )

{

Console.WriteLine( "Implementing Decrypt" );

}

}

public class Tester

{

static void Main( )

{

// create a document object

Document doc = new Document( "Test Document" );

// cast the document to the various interfaces

IStorable isDoc = doc as IStorable;

if ( isDoc != null )

{

isDoc.Read( );

}

else

Console.WriteLine( "IStorable not supported" );

ICompressible icDoc = doc as ICompressible;

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

302

if ( icDoc != null )

{

icDoc.Compress( );

}

else

Console.WriteLine( "Compressible not supported" );

ILoggedCompressible ilcDoc = doc as ILoggedCompressible;

if ( ilcDoc != null )

{

ilcDoc.LogSavedBytes( );

ilcDoc.Compress( );

// ilcDoc.Read( );

}

else

Console.WriteLine( "LoggedCompressible not supported" );

IStorableCompressible isc = doc as IStorableCompressible;

if ( isc != null )

{

isc.LogOriginalSize( ); // IStorableCompressible

isc.LogSavedBytes( ); // ILoggedCompressible

isc.Compress( ); // ICompressible

isc.Read( ); // IStorable

}

else

{

Console.WriteLine( "StorableCompressible not supported" );

}

IEncryptable ie = doc as IEncryptable;

if ( ie != null )

{

ie.Encrypt( );

}

else

Console.WriteLine( "Encryptable not supported" );

}

}

}

Output:

Creating document with: Test Document

Implementing the Read Method for IStorable

Implementing Compress

Implementing LogSavedBytes

Implementing Compress

Implementing LogOriginalSize

Implementing LogSavedBytes

Implementing Compress

Implementing the Read Method for IStorable

Implementing Encrypt

آغاز م یشود. سپس واسط دومی به واسط Icompressible و Istorable 2 با پیاده سازی واسط - مثال 17

ترکیب م یشوند و در IStorablecompressible بسط داده می شود و سپس هر دو در ILoggedCompressible

اضافه می کند. IEncryptable نهایت، یک واسط جدید بنام

جدید ایجاد می کند و سپس آن را بصورت یک نمونه از واس طهای متنوع به کار می برد. Document شی Tester برنامه ی

شما برای قالب بندی آزاد هستید.

;ICompressibleicDoc = doc as ICompressible

را پیاده سازی می کند. پس Icompressible واسط doc البته این عمل غیر ضروری است، چون کامپایلر م یداند که

می توان از قال ببندی ضمنی استفاده کرد:

ICompressible icDoc = doc;

فصل هفدهم واسط ها

303

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

است یا نه. null قالب بندی کنید و سپس تست کنید آیا شی قال ببندی شده

ICompressible icDoc = doc as ICompressible;

if ( icDoc != null )

{

icDoc.Compress( );

}

else

Console.WriteLine( "Compressible not supported" );

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

;ILoggedCompressible icDoc=doc as ILoggedCompressible

-2-17 دستیابی به متدهای واسط

باشند: Document دستیابی کنید، همانطور که اگر آنها اعضای کلاس IStorable می توانید به اعضای واسط

Document doc = new Document("Test Document");

doc.status = -١;

doc.Read();

به نوع داده ی واسط ایجاد کنید و سپس آن واسط را برای Document می توانید یک نمونه از واسط را بوسیله قالب بندی

دستیابی به متدها بکار برید.

IStorable isDoc = doc;

isDoc.status = ٠;

isDoc.Read( );

است. همانطور که قبلاً بیان کردیم، نمی توانید مستقیماً IStorable یک Document در این حالت، در واقع م یدانید که

یک نمونه از یک واسط ایجاد کنید. بدین دلیل، نمی توانید بنویسید:

IStorable isDoc = new IStorable();

با این وجود، می توانید یک نمونه از کلاس پیاده سازی کننده را به صورت زیر ایجاد کنید:

Document doc = new Document("Test Document");

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

IStorable isDoc = doc;

می توانید این دو مرحله را بصورت زیر ترکیب کنید.

IStorable isDoc = new Document("Test Document");

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

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

چشم پوشی کرده و به جای همدیگر بکار ببرید.

-1-2-17 قالب بندی به یک واسط

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

یا هر دو را پشتیبانی می کند؟ فقط می توانید ICompressible یا IStorable است ندانید که آیا یک شی خاص، واسط

آنها را به واسط ها قالب بندی کنید.

Document doc = myCollection[٠];

IStorable isDoc = (IStorable) doc;

isDoc.Read( );

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

304

ICompressible icDoc = (ICompressible) doc;

icDoc.Compress( );

را پیاده سازی می کند: IStorable فقط واسط Document اگر آن بفهمد که

public class Document : IStorable

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

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

An exception of type System.InvalidCastException was thrown.

is -2-2-17 عملگر

دو روش برای #C . برای احضار متدهای مناسب، دوست داریم قادر باشیم واسط پشتیبانی شده توسط کلاس را بشناسیم

بصورت زیر است. is است . گرامر عملگر is انجام این کار دارد. روش اول، کاربرد عملگر

expression is type

3- ارزیابی م یشود. مثال 17 true به مقدار is بدون رها کردن استثناء انجام شود، عملگر type در صورتی که قال ببندی به

ارائه Document توسط کلاس ICompressible و IStorable را برای تست پیاده سازی واسط های is کاربرد عملگر

می کند.

3- مثال 17

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

#endregion

namespace IsOperator

{

interface IStorable

{

void Read( );

void Write( object obj );

int Status { get; set; }

}

// here's the new interface

interface ICompressible

{

void Compress( );

void Decompress( );

}

// Document implements IStorable

public class Document : IStorable

{

private int status = ٠;

public Document( string s )

{

Console.WriteLine(

"Creating document with: {٠}", s );

}

// IStorable.Read

public void Read( )

{

Console.WriteLine( "Reading...");

}

// IStorable.Write

public void Write( object o )

{

Console.WriteLine( "Writing...");

}

فصل هفدهم واسط ها

305

// IStorable.Status

public int Status

{

get

{

return status;

}

set

{

status = value;

}

}

}

// derives from Document and implements ICompressible

public class CompressibleDocument : Document, ICompressible

{

public CompressibleDocument(String s) :

base(s)

{ }

public void Compress( )

{

Console.WriteLine("Compressing...");

}

public void Decompress( )

{

Console.WriteLine("Decompressing...");

}

}

public class Tester

{

static void Main( )

{

// A collection of Documents

Document[] docArray = new Document[٢];

// First entry is a Document

docArray[٠] = new Document( "Test Document" );

// Second entry is a CompressibleDocument (ok because

// CompressibleDocument is a Document)

docArray[١] =

new CompressibleDocument("Test compressibleDocument");

// don't know what we'll pull out of this hat

foreach (Document doc in docArray)

{

// report your name

Console.WriteLine("Got: {٠}", doc);

// Both pass this test

if (doc is IStorable)

{

IStorable isDoc = (IStorable)doc;

isDoc.Read( );

}

// fails for Document

// passes for CompressibleDocument

if (doc is ICompressible)

{

ICompressible icDoc = (ICompressible)doc;

icDoc.Compress( );

}

}

}

}

}

Output:

Creating document with: Test Document

Creating document with: Test compressibleDocument

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

306

Got: IsOperator.Document

Reading...

Got: IsOperator.CompressibleDocument

Reading...

Compressing...

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

if (doc is IStorable)

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

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

if (doc is ICompressible)

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

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

این تست را برای شما انجام م یدهد. is را پیاده سازی می کند. عملگر ICompressible واسط ،Document نوع داده ی

as -3-2-17 عملگر

و قالب بندی را باهم ترکیب می کند. ابتدا بررسی می کند آیا عمل قال ببندی معتبر است، اگر معتبر is عملیات as عملگر

برمی گرداند. null مقدار as باشد، عمل قالب بندی را انجام می دهد. اگر عمل قالب بندی معتبر نباشد، عملگر

نیاز به اداره کردن استثناءهای قال ببندی را حذف م یکند. و از سربار مربوط به دو عمل قال ببندی دوری ،as کاربرد عملگر

بهینه است. as می کنیم. بدین دلایل، قال ببندی واسط ها با استفاده از

بصورت زیر است. as گرامر عملگر

expression as type

وفق می دهد. null و تست مقدار as 3 را با استفاده از عملگر - کد زیر، کد مثال 17

static void Main()

{

// A collection of Documents

Document[] docArray = new Document[٢];

// First entry is a Document

docArray[٠] = new Document( "Test Document" );

// Second entry is a CompressibleDocument (ok because

// CompressibleDocument is a Document)

docArray[١] = new CompressibleDocument("Test compressibleDocument");

// don't know what we'll pull out of this hat

foreach (Document doc in docArray)

{

// report your name

Console.WriteLine("Got: {٠}", doc);

// Both pass this test

IStorable isDoc = doc as IStorable;

if (isDoc != null)

{

isDoc.Read( );

}

// fails for Document

// passes for CompressibleDocument

ICompressible icDoc = doc as ICompressible;

if (icDoc != null)

{

icDoc.Compress( );

}

}

فصل هفدهم واسط ها

307

}

is و as -4-2-17 مقایسه عملگرهای

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

کاراتر است. در بعضی مواقع فقط می خواهید نوع داده را تست کنید و عمل قال ببندی لازم as فوراً انجام دهید، عملگر

بهتر است. is نیست، در این حالت عملگر

-5-2-17 مقایسه کلاس انتزاعی و واسط

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

انتزاعی باشد.

abstract class Storable

{

abstract public void Read();

abstract public void Write( );

}

از یک List ارث بری کند و تفاوتی با کاربرد واسط ها ندارد. فرض کنید یک کلاس Storable می تواند از Document

را ایجاد کنید StorableList می توانید کلاس ++C را دارد. در Storable شرکت خریداری کرد هاید که توانایی ترکیب با

وراثت چندگانه را مجاز نمی دارد. #C امکان پذیر نیست، چون #C ارث بری کند، اما در Storable و List که از هر دو کلاس

به Storable پیاده سازی هر تعداد واسط و مشتق گرفتن یک کلاس پایه را مجاز می دارد. پس با ایجاد #C ، با این وجود

بصورت زیر خواهد StorableList ارث بری کنید. مثال IStorable و واسط List عنوان یک واسط، م یتوانید از کلاس

شد.

public class StorableList : List, IStorable

{

// List methods here ...

public void Read( ) {...}

public void Write(object obj) {...}

// ...

}

کردن پیاده سازی های واسط override-3-17

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

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

علامت گذاری virtual را بصورت ()Write و ()Read را پیاده سازی کند و متدهای IStorable واسط ،Document کلاس

را برای نوشتن در یک فایل پیاده سازی کند و توسعه ()Write و ()Read متدهای Document کنید. ممکن است کلاس

را برای خواندن و نوشتن در پایگاه داده بکار برند. Document دهندگان بخواهند انواع داده جدید مشتق شده از

()Read کردن یک پیاده سازی واسط را ارائه می کند. متد override 3 را از بین م یبرد و - 4 پیچیدگی مثال 17 - مثال 17

مشتق Note پیاده سازی می شود و در کلاس ()Document.Read علامت گذاری می شود و بوسیل هی virtual بصورت

می شوند. override ،Document شده از

4- مثال 17

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

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

308

#endregion

namespace overridingInterface

{

interface IStorable

{

void Read( );

void Write( );

}

// Simplify Document to implement only IStorable

public class Document : IStorable

{

// the document constructor

public Document( string s )

{

Console.WriteLine(

"Creating document with: {٠}", s );

}

// Make read virtual

public virtual void Read( )

{

Console.WriteLine(

"Document Read Method for IStorable" );

}

// NB: Not virtual!

public void Write( )

{

Console.WriteLine(

"Document Write Method for IStorable" );

}

}

// Derive from Document

public class Note : Document

{

public Note( string s ):

base(s)

{

Console.WriteLine(

"Creating note with: {٠}", s );

}

// override the Read method

public override void Read( )

{

Console.WriteLine(

"Overriding the Read method for Note!" );

}

// implement my own Write method

public new void Write( )

{

Console.WriteLine(

"Implementing the Write method for Note!" );

}

}

public class Tester

{

static void Main( )

{

// create a document reference to a Note object

Document theNote = new Note( "Test Note" );

IStorable isNote = theNote as IStorable;

if ( isNote != null )

{

isNote.Read( );

isNote.Write( );

}

Console.WriteLine( "\n" );

فصل هفدهم واسط ها

309

// direct call to the methods

theNote.Read( );

theNote.Write( );

Console.WriteLine( "\n" );

// create a note object

Note note٢ = new Note( "Second Test" );

IStorable isNote٢ = note٢ as IStorable;

if ( isNote٢ != null )

{

isNote٢.Read( );

isNote٢.Write( );

}

Console.WriteLine( "\n" );

// directly call the methods

note٢.Read( );

note٢.Write( );

}

}

}

Output:

Creating document with: Test Note

Creating note with: Test Note

Overriding the Read method for Note!

Document Write Method for IStorable

Overriding the Read method for Note!

Document Write Method for IStorable

Creating document with: Second Test

Creating note with: Second Test

Overriding the Read method for Note!

Document Write Method for IStorable

Overriding the Read method for Note!

Implementing the Write method for Note!

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

علامت گذاری virtual انتخاب کرده است. در دنیای واقعی، یا همه یا هیچکدام بصورت virtual را بصورت ()Read

کند و آزادی عمل دارد. override را ()Read متد Note می شوند. ضروری نیست کلاس

به 4 روش فراخوانی می شوند: Write و Read متدهای ،Tester در کلاس

+ از طریق ارجاع کلاس پایه به شی مشتق شده

+ از طریق یک واسط ایجاد شده از روی ارجاع کلاس پایه به شی مشتق شده

+ از طریق یک شی مشتق شده

+ از طریق یک واسط ایجاد شده از روی شی مشتق شده

Heap جدید ایجاد شده روی Note ایجاد می شود و آدرس یک شی Document برای بنا کردن دو فراخوانی اول، یک ارجاع

انتساب داده می شود. Document به ارجاع

;("Document theNote = new Note("Test Note

استفاده م یشود: IStorable به ارجاع Document برای قال ببندی as یک ارجاع واسط ایجاد می شود و عملگر

IStorable isNote = theNote as IStorable;

را از ()Write و ()Read را از طریق واسط احضار کنید. البته می توان متدهای ()Write و ()Read حال می توانید متدهای

فراخوانی Document از ()Write و متد Note از ()Read طریق خود شی بطور مستقیم فراخوانی کرد. در هر دو حالت، متد

می شوند(به دلیل چند ریختی ).

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

310

آن را فراخوانی کنید. ()Write و ()Read تعریف کنید و مستقیماً متدهای Note برای فهم بیشتر مطلب، یک شی از کلاس

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

Note note٢ = new Note("Second Test");

-4-17 پیاده سازی صریح واسط

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

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

و IStorable 5 دو واسط - اگر یک کلاس دو واسط را پیاده سازی کند که متد های هم نام دارند، چه اتفاقی م یافتد. مثال 17

در ()Read برای خواندن کتاب با صدای بلند است. متأسفانه، این متد با متد ITalk در ()Read را ایجاد می کند. متد ITalk

تداخل دارد. IStorable

حداقل پیاده سازی صریح را برای یکی ،( Document) را دارند، باید کلاس پیاده سازی کننده ()Read چون هر دو واسط، متد

از این دو متد بکار برد. در پیاده سازی صریح، کلاس پیاد هسازی کننده، صریحاً واسط متد را معین می کند.

void ITalk.Read()

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

پیاده سازی صریح نیست.

public void Talk( )

چون تداخلی وجود ندارد، می تواند بصورت معمول تعریف شود.

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

void ITalk.Read( )

است. public این متد بطور ضمنی

new و override ،virtual ،abstract در حقیقت متد اعلان شده از طریق پیاده سازی صریح نمی تواند با معر فهای

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

است. IStorable بنویسید، کامپایلر فرض می کند هدف شما واسط پیاده سازی شده ضمنی برای

theDoc.Read( );

تنها روش دسترسی به واسط پیاده سازی شده صریح، از طریق قال ببندی به یک واسط است.

ITalk itDoc = theDoc;

itDoc.Read();

5 نشان داده م یشود. - پیاده سازی صریح در مثال 17

5- مثال 17

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

#endregion

namespace ExplicitImplementation

{

interface IStorable

{

void Read( );

void Write( );

فصل هفدهم واسط ها

311

}

interface ITalk

{

void Talk( );

void Read( );

}

// Modify Document to implement IStorable and ITalk

public class Document : IStorable, ITalk

{

// the document constructor

public Document( string s )

{

Console.WriteLine( "Creating document with: {٠}", s );

}

// Make read virtual

public virtual void Read( )

{

Console.WriteLine( "Implementing IStorable.Read" );

}

public void Write( )

{

Console.WriteLine( "Implementing IStorable.Write" );

}

void ITalk.Read( )

{

Console.WriteLine( "Implementing ITalk.Read" );

}

public void Talk( )

{

Console.WriteLine( "Implementing ITalk.Talk" );

}

}

public class Tester

{

static void Main( )

{

// create a document object

Document theDoc = new Document( "Test Document" );

IStorable isDoc = theDoc;

isDoc.Read( );

ITalk itDoc = theDoc;

itDoc.Read( );

theDoc.Read( );

theDoc.Talk( );

}

}

}

Output:

Creating document with: Test Document

Implementing IStorable.Read

Implementing ITalk.Read

Implementing IStorable.Read

Implementing ITalk.Talk

-1-4-17 در اختیار قراردادن متدهای انتخابی از واسط

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

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

Document بخشی از واسط عمومی ()Read() , Write را پیاده سازی می کند. اما نم یخواهد متدهای IStorable

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

را پیاده سازی می کند. اگر IStorable را حفظ می کند، در حالیکه آن هنوز هم Document های عمومی API بود. این عمل

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

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

312

متد Document 5، شی - در آن وجود ندارند. در مثال 17 ()Write و ()Read، را بکار م یبرد Document زمانی که شی

فقط از طریق عمل قالب بندی ()ITalk.Read در اختیار قرار می دهد، اما Document را به عنوان یک متد از ()Talk

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

جلوگیری م یکند، یک کلاس مشتق شده مجبور است متد را virtual توجه: چون پیاد هسازی صریح واسط ، از کاربرد

را مجدداً پیاد هسازی کند. ()ITalk.Read مشتق شود، آن باید Document از Note مجدداً پیاد هسازی کند. پس، اگر

-2-4-17 پنهان کردن اعضا

P داریم که خصوصیتی بنام IBase پنهان کردن عضوی از یک واسط امکان پذیر است. برای مثال، فرض کنید یک واسط بنام

دارد.

interface IBase

{

int P { get; set; }

}

پنهان می کند. ()P را با یک متد P مشتق می کنیم که خصوصیت IDerived فرض کنید یک واسط جدید بنام

interface IDerived : IBase

{

new int P();

}

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

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

class myClass : IDerived

{

// explicit implementation for the base property

int IBase.P { get {...} }

// implicit implementation of the derived method

public int P( ) {...}

}

class myClass : IDerived

{

// implicit implementation for the base property

public int P { get {...} }

// explicit implementation of the derived method

int IDerived.P( ) {...}

}

class myClass : Iderived

{

// explicit implementation for the base property

int IBase.P { get {...} }

// explicit implementation of the derived method

int IDerived.P( ) {...}

}

-3-4-17 دستیابی به کلاس های مهرشده و انواع داده ی مقداری

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

مقداری از این قضیه مستثنی هستند. در این حالت، احضار متد واسط از طریق شی ارجح تر است.

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

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

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

فصل هفدهم واسط ها

313

ایجاد IStorable 6 یک ساختار برای پیاده سازی - تغییر دهید، نوع داده ی جعبه بندی شده بدون تغییرمی ماند. مثال 17

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

6- مثال 17

using System;

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

#endregion

namespace ReferencesOnValueTypes

{

// declare a simple interface

interface IStorable

{

void Read( );

int Status { get;set;}

}

// Implement through a struct

public struct myStruct : IStorable

{

public void Read( )

{

Console.WriteLine(

"Implementing IStorable.Read" );

}

public int Status

{

get

{

return status;

}

set

{

status = value;

}

}

private int status;

}

public class Tester

{

static void Main( )

{

// create a myStruct object

myStruct theStruct = new myStruct( );

theStruct.Status = -١; // initialize

Console.WriteLine(

"theStruct.Status: {٠}", theStruct.Status );

// Change the value

theStruct.Status = ٢;

Console.WriteLine( "Changed object." );

Console.WriteLine(

"theStruct.Status: {٠}", theStruct.Status );

// cast to an IStorable

// implicit box to a reference type

IStorable isTemp = ( IStorable ) theStruct;

// set the value through the interface reference

isTemp.Status = ۴;

Console.WriteLine( "Changed interface." );

Console.WriteLine( "theStruct.Status: {٠}, isTemp: {١}",

theStruct.Status, isTemp.Status );

// Change the value again

theStruct.Status = ۶;

 

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

Console.WriteLine( "Changed object." );

Console.WriteLine( "theStruct.Status: {٠}, isTemp: {١}",

theStruct.Status, isTemp.Status );

}

}

}

Output:

theStruct.Status: -١

Changed object.

theStruct.Status: ٢

Changed interface.

theStruct.Status: ٢, isTemp: ۴

Changed object.

theStruct.Status: ۶, isTemp: ۴

دارد. این واسط با یک ساختاری بنام Status و یک خصوصیت ()Read یک متد IStorable 6 واسط - در مثال 17

پیاده سازی می شود. myStruct

public struct myStruct : IStorable

است. با ایجاد یک نمونه از ساختار و مقداردهی خصوصیت با 1- شروع م یشود. سپس مقدار Tester کد جالب در داخل

چاپ می شود. Status

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

theStruct.Status: -١

از طریق خود شی تغییر م یدهد. خروجی بصورت زیر تغییر م ییابد. Status سپس مقدار خصوصیت

Changed object.

theStruct.Status: ٢

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

به 4 بکار برید. خروجی Status ایجاد می کند. سپس این واسط را برای تغییر دادن مقدار theStruct شی مقداری

می تواند کمی جالب به نظر رسد:

Changed interface.

theStruct.Status: ٢, isTemp: ۴

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

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

جعبه بندی شده برای ارجاع واسط تغییر نیافته است.

Changed object.

theStruct.Status: ۶, isTemp: ۴

-5-17 خلاصه

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

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

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

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

هستند. public می کند. متدهای واسط مطلقاً

فصل هفدهم واسط ها

315

بسط دادن یک واسط موجود برای اضافه کردن متدها یا اعضای جدید یا تغییر نحو هی کار اعضای موجود امکا نپذیر

است.

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

می توانید واسط های جدیدی با ترکیب واسط های موجود و اضافه کردن خصوصیات و متدهای جدید ایجاد کنید.

و قال ببندی را باهم ترکیب می کند. ابتدا بررسی می کند آیا عمل قالب بندی معتبر است، اگر is عملیات as − عملگر

برمی گرداند. null مقدار as معتبر باشد، عمل قال ببندی را انجام می دهد. اگر عمل قالب بندی معتبر نباشد، عملگر

را تغییر دهید تا یک IStorable − واسط ها بسیار شبیه کلا سهای انتزاعی هستند. در حقیقت می توانید اعلان یک

کلاس انتزاعی باشد.

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

کند.

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

تنها روش دسترسی به واسط پیاده سازی شده صریح، از طریق قال ببندی به یک واسط است.

پنهان کردن عضوی از یک واسط امکان پذیر است

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

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

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