Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π—Π«Πš ΠŸΠ ΠžΠ“Π ΠΠœΠœΠ˜Π ΠžΠ’ΠΠΠ˜Π― Π‘# 2005 И ΠŸΠ›ΠΠ’Π€ΠžΠ ΠœΠ .NET 2.0. 3-Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 47

Автор Π­Π½Π΄Ρ€ΡŽ ВроСлсСн

 protected string empSSN;

 protected int empAge;

 β€¦

}

Удобство опрСдСлСния Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ свойства. НСдостатком, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ прямом доступС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ родитСля Π²ΠΏΠΎΠ»Π½Π΅ вСроятно случайноС Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ», установлСнных Π² Ρ€Π°ΠΌΠΊΠ°Ρ… общСдоступных свойств (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ допустимого числа страниц для "ΠΌΠΈΠ½ΠΈ-Ρ€ΠΎΠΌΠ°Π½Π°"). Боздавая Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹, Π²Ρ‹ Π·Π°Π΄Π°Π΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ довСрия ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ классом, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π½Π΅ смоТСт ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ ΠΏΡ€Π°Π²ΠΈΠ», прСдусмотрСнных Π²Π°ΠΌΠΈ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

НаконСц, слСдуСт ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ находится "Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ сСмСйства"). Π’Π°ΠΊ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½.

static void Main(string[] args) {

 // Ошибка! Π—Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ нСдоступны Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ экзСмпляра.

 Employee emp = new Employee();

 emp.empSSN = "111-11-1111";

}

Π—Π°ΠΏΡ€Π΅Ρ‚ наслСдования: ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ классы

Боздавая ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов ΠΈ подклассов, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ². Но Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ класс, Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ подклассов? НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² нашС пространство ΠΈΠΌΠ΅Π½ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ класс, Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‰ΠΈΠΉ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ SalesPerson. На рис. 4.8 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ схСма.


Рис. 4.8. Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ иСрархия слуТащих

Класс PTSalesPerson являСтся классом, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° Π½Π΅ΠΏΠΎΠ»Π½ΡƒΡŽ ставку, ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π΅ ΠΌΠΎΠ³ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ подклассы ΠΈΠ· PTSalesPerson. (Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΊΠ°ΠΊΡƒΡŽ Π΅Ρ‰Π΅ Π½Π΅ΠΏΠΎΠ»Π½ΡƒΡŽ ставку ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π° основС Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠΉ ставки?) Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ возмоТности Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ класса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово C# sealed.

// Класс PTSalesPerson Π½Π΅ смоТСт Π±Ρ‹Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ классом.

public sealed class PTSalesPerson: SalesPerson {

 public PTSalesPerson(string fullName, int age, int empID, float currPay, string ssn, int numbOfSales): base (fullName, age, empID, currPay, ssn, numbOfSales) {

  // Π›ΠΎΠ³ΠΈΠΊΠ° конструктора…

 }

 // Π”Ρ€ΡƒΠ³ΠΈΠ΅ члСны…

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс PTSalesPerson ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Классам Π½ΠΈΠΊΠ°ΠΊΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ PTSalesPersΠΎn Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ сообщСниС ΠΎΠ± ошибкС компиляции.

// Ошибка компиляции!

public class ReallyPTSalesPerson: PTSalesPerson {…}

НаиболСС ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово sealed оказываСтся ΠΏΡ€ΠΈ создании Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Ρ… классов ΡƒΡ‚ΠΈΠ»ΠΈΡ‚. Класс String, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π² пространствС ΠΈΠΌΠ΅Π½ SΡƒstem, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, явно ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½.

public sealed class string: object, IComparable, ICloneable, IConvertible, IEnumerable {…}

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹ Π½Π΅ смоТСтС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ класс, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ System.String:

// Бнова ошибка!

public class MyString: string

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ класс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ класса, СдинствСнным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ классичСского наслСдования ΠΈ использованиС ΠΌΠΎΠ΄Π΅Π»ΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ/дСлСгирования (извСстной Π΅Ρ‰Π΅ ΠΊΠ°ΠΊ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, "has-a").

МодСль Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ/дСлСгирования

Как ΡƒΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ Π² этой Π³Π»Π°Π²Π΅, наслСдованиС ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ двумя способами. Волько Ρ‡Ρ‚ΠΎ ΠΌΡ‹ исслСдовали классичСскоС ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ подчинСнности ("is-a"). Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ обсуТдСниС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° ООП, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ "has-a", Ρ‚Π°ΠΊΠΆΠ΅ извСстноС ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ/дСлСгирования). ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ создали Π½ΠΎΠ²Ρ‹ΠΉ класс, ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ Π»ΡŒΠ³ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠ°.

// Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ класс.

public class BenefitPackage {

 // Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ страховок,

 // мСдицинского обслуТивания ΠΈ Ρ‚.Π΄.

 public double ComputePayDeduction() {return 125.0;}

}

Ясно, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ подчинСнности ("is-a") ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ BenefitPackage (ΠΏΠ°ΠΊΠ΅Ρ‚ Π»ΡŒΠ³ΠΎΡ‚) ΠΈ Employee (Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊ) выглядСло Π±Ρ‹ достаточно странно. (ЯвляСтся Π»ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ Π»ΡŒΠ³ΠΎΡ‚? Вряд Π»ΠΈ.) Но Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ясно ΠΈ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ какая-Ρ‚ΠΎ связь ΠΌΠ΅ΠΆΠ΄Ρƒ этими Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°. ΠšΠΎΡ€ΠΎΡ‡Π΅, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚Ρƒ идСю, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ ("has-a") ΠΏΠ°ΠΊΠ΅Ρ‚ Π»ΡŒΠ³ΠΎΡ‚. Для этого ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса Employee слСдуСт ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ", ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

// Π Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠΌΠ΅ΡŽΡ‚ Π»ΡŒΠ³ΠΎΡ‚Ρ‹.

public class Employee {

 β€¦

 // Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ BenefitPackage.

 protected BenefitPackage empBenefits = new BenefitPackage();

}

Π—Π΄Π΅ΡΡŒ Π²Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ создали Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΌΠΈΡ€Ρƒ, трСбуСтся Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π”Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² класс-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Ρ‚Π°ΠΊΠΈΡ… Ρ‡Π»Π΅Π½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности содСрТащСгося Π² классС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ класс Employee Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π» содСрТащийся Π² Π½Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ empBenefits с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ свойства, Π° Ρ‚Π°ΠΊΠΆΠ΅ позволял ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° GetBenefitCost().

public class Employee {

 protected BenefitPackage empBenefits = new BenefitPackage();

 // ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

 public double GetBenefitCost() {

  return empBenefits.ComputePayDeduction();

 }

 // Доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ свойство.

 public BenefitPackage Benefits {

  get {return empBenefits;}

  set {empBenefits = value;}

 }

}

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Main() ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ BenefitsPackage, опрСдСляСмым Ρ‚ΠΈΠΏΠΎΠΌ Employee.

static void Main(string[] args) {

 Manager mel;

 mel = new Manager();

 Console.WriteLine (mel.Benefits.ComputerPayDeduction());

…

 ConsolΠ΅.ReadLine();

}

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ²

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ООП (ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ), Π΄Π°Π²Π°ΠΉΡ‚Π΅ обсудим Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ программирования, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ². Π’ C# ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ (ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ, класс, интСрфСйс, структуру ΠΈΠ»ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚) Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… области видимости класса ΠΈΠ»ΠΈ структуры. ΠŸΡ€ΠΈ этом Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ("Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ") Ρ‚ΠΈΠΏ считаСтся Ρ‡Π»Π΅Π½ΠΎΠΌ содСрТащСго Π΅Π³ΠΎ ("внСшнСго") класса, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния срСды выполнСния Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΌΡΡ ΠΎΡ‚ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‡Π»Π΅Π½Π° (поля, свойства, ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, события ΠΈ Ρ‚.ΠΏ.). Бинтаксис, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для влоТСния Ρ‚ΠΈΠΏΠ°, ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прост.

public class OuterClass {

 // ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС.

 public class PublicInnerClass{}

 // ΠŸΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π»Π΅Π½Ρ‹

 // содСрТащСго Π΅Π³ΠΎ класса.

 private class PrivateInnerClass{}

}

Бинтаксис здСсь ясСн, Π½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ это Π΄Π΅Π»Π°Ρ‚ΡŒ, Π½Π΅ Ρ‚Π°ΠΊ просто. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ ΠΊ пониманию этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ Π½Π°Π΄ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ.

β€’ Π’Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ("has-a"), Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ доступом Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°, Π° Π½Π΅ содСрТащСгося ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

β€’ Π’Π²ΠΈΠ΄Ρƒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ являСтся Ρ‡Π»Π΅Π½ΠΎΠΌ класса-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, этот Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ Ρ‡Π»Π΅Π½Π°ΠΌ Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса.

β€’ Часто Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈΠ³Ρ€Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΡŒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта для класса-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΈ Π΅Π³ΠΎ использованиС "внСшним ΠΌΠΈΡ€ΠΎΠΌ" Π½Π΅ прСдполагаСтся.

Когда Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΈΠΏ содСрТит Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ класса, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‡Π»Π΅Π½Ρ‹-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ для любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ своСго элСмСнта Π΄Π°Π½Π½Ρ‹Ρ…. Но Ссли Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈΠ·-Π·Π° Π³Ρ€Π°Π½ΠΈΡ† внСшнСго Ρ‚ΠΈΠΏΠ°, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΡƒΠΊΠ°Π·Π°Π² Π΅Π³ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ имя. Π˜Π·ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

static void Main (string[] args) {

 // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ использованиС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ класса. ВсС ОК!

 OuterClass.PublicInnerClass inner;

 inner = new OuterClass.PublicInnerClass();

 // Ошибка компиляции! НСт доступа ΠΊ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠΌΡƒ классу.

 OuterClass.PrivateInnerClass inner2;

 inner2 = new OuterClass.PrivateInnerClass();

}

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²Π»ΠΎΠΆΠΈΠ»ΠΈ BenefitPackage нСпосрСдствСнно Π² Ρ‚ΠΈΠΏ класса Employee.

// Π’Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ BenefitPackage.

public class Employee {

 ...