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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Освой ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π‘++ Π·Π° 21 дСнь.Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 89

Автор ДТСсс Π›ΠΈΠ±Π΅Ρ€Ρ‚ΠΈ

68:    protected:

69:       COLOR itsColor;

70: };

71:

72: class Dog : public Mammal

73: {

74:    public:

75:       Dog(int age, COLOR color ):

76:          Mammal(age), itsColor(color)

77:             { cout << "Dog constructor...\n"; }

78:       virtual ~Dog() { cout << "Dog destructor...\n"; }

79:       virtual void Speak()const { cout << "Woof!... \n"; }

80:       virtual void 51eep() const { cout << "Dog snoring...\n"; }

81:       virtual void Eat() const { cout << "0og eating...\n"; }

82:       virtual void Move() const { cout << "Dog running...\n"; }

83:       virtual void Reproduce() const

84:          { cout << "Dogs reproducing...\n"; }

85:

86:    protected:

87:       COLOR itsColor;

88: };

89:

90: int main()

91: {

92:    Animal *pAnimal=0;

93:    int choice;

94:    bool fQuit = false;

95:

96:    while (1)

97:    {

98:       cout << "(1)Dog (2)Horse (3)Fish(0)Quit: ";

99:       cin >> choice; 100:

101:      switch (choice)

102:      {

103:         case 1: pAnimal = new Dog(5,Brown);

104:         break;

105:         case 2: pAnimal = new Horse(4,Black);

106:         break;

107:         case 3: pAnimal = new

108:         break;

109:         default: fQuit = true

110:         break;

111:      }

112:      if (fQuit)

113:         break;

114:

115:      pAnimal->Speak();

116:      pAnimal->Eat();

117:      pAnimal->Reproduce();

118:      pAnimal->Move();

119:      pAnimal->Sleep();

120:      delete pAnimal;

121:      cout << "\n";

122:   }

123:   return 0;

124: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

(1)Dog (2)Horse (3)Bird (0)Quit: 1

Animal constructor. . .

Mammal constructor...

Dog constructor...

Woof!...

Dog eating. . .

Dog reproducing....

Dog running...

Dog snoring...

Dog destructor...

Mammal destructor...

Animal destructor...

(1)Dog (2)Horse (3)Bird (0)Quit: 0


Анализ: Π’ строках 7β€”21 ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ абстрактный Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Animal. ЕдинствСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ этого класса, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ чистой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, это ΠΎΠ±Ρ‰ΠΈΠΉ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² всСх ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов ΠΌΠ΅Ρ‚ΠΎΠ΄ itsAge. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² β€” Sleep(), Eat(), Reproduce(), Move() ΠΈ Speak() β€” ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ чистыС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Класс Mammal производится ΠΎΡ‚ Animal Π² строках 29β€”37 ΠΈ Π½Π΅ содСрТит Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. Π’ Π½Π΅ΠΌ замСщаСтся функция Reproduce(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ способ размноТСния, ΠΎΠ±Ρ‰ΠΈΠΉ для всСх ΠΌΠ»Π΅ΠΊΠΎΠΏΠΈΡ‚Π°ΡŽΡ‰ΠΈΡ…. Класс Fish производится нСпосрСдствСнно ΠΎΡ‚ класса Animal, поэтому функция Reproduce() Π² Π½Π΅ΠΌ замСщаСтся ΠΈΠ½Π°Ρ‡Π΅, Ρ‡Π΅ΠΌ Π² классС Mammal (ΠΈ это соотвСтствуСт Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ).

Π’ΠΎ всСх Π΄Ρ€ΡƒΠ³ΠΈΡ… классах, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΎΡ‚ класса Mammal, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅Ρ‚ нСобходимости Π·Π°ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ для всСх ΠΌΠ΅Ρ‚ΠΎΠ΄ Reproduce(), хотя ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ класса, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ это Π±Ρ‹Π»ΠΎ сдСлано Π² строкС 83 для класса Dog. ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ чистыС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² классах Fish, Horse ΠΈ Dog, поэтому для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

Π’ Ρ‚Π΅Π»Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ класса Animal, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ ссылки Π½Π° всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов. Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, с ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ связан ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ для классов абстрактных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Animal ΠΈΠ»ΠΈ Mammal компилятор ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ сообщСниС ΠΎΠ± ошибкС.

Когда слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ абстрактныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ ΠΎΠ΄Π½ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, рассмотрСнных Π½Π°ΠΌΠΈ Ρ€Π°Π½Π΅Π΅, класс Animal являлся абстрактным Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… β€” Π½Π΅Ρ‚. Π’ ΠΊΠ°ΠΊΠΈΡ… ΠΆΠ΅ случаях Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ класс ΠΊΠ°ΠΊ абстрактный Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…?

НСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈ Π±Ρ‹ объявлСния класса ΠΊΠ°ΠΊ абстрактного. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎ создании абстрактного Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΡƒΡŽ Ρ€ΠΎΠ»ΡŒ ΠΈΠ³Ρ€Π°Π΅Ρ‚ этот класс Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π’Π°ΠΊ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„Π΅Ρ€ΠΌΡƒ ΠΈΠ»ΠΈ Π·ΠΎΠΎΠΏΠ°Ρ€ΠΊ, Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл класс Animal ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ абстрактный ΠΈ для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ Π½Π΅Π³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ классы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Dog.

Если ΠΆΠ΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡΠ°Ρ€Π½ΡŽ, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ класс Dog Π±ΡƒΠ΄Π΅Ρ‚ абстрактным, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ подклассы, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠΎΡ€ΠΎΠ΄Ρ‹ собак. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ абстрактных классов слСдуСт Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, насколько Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ явлСниС.


РСкомСндуСтся:Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ абстрактныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… для создания ΠΎΠ±Ρ‰Π΅Π³ΠΎ интСрфСйса для всСх ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классах всС чистыС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠžΠ±ΡŠΡΠ²Π»ΡΠΉΡ‚Π΅ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классах, ΠΊΠ°ΠΊ чистыС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.


НС рСкомСндуСтся:НС ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½ΠΎΠ³ΠΎ класса.

Π›ΠΎΠ³ΠΈΠΊΠ° использования абстрактных классов

Π’ послСднСС врСмя Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° C++ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ концСпция создания абстрактных логичСских конструкций. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊΠΈΡ… конструкций ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΎΠ±Ρ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»Π΅Π³ΠΊΠΎ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создания логичСской конструкции с использованиСм наслСдования классов.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ класс Timer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ сСкунды. Π’Π°ΠΊΠΎΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ†Π΅Π»ΠΎΡ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ itsSeconds, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ itsSeconds.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ itsSeconds. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° ΡƒΠΌ, β€” это Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² класс Timer ΠΌΠ΅Ρ‚ΠΎΠ΄ увСдомлСния ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π°. Но логичСски это Π½Π΅ совсСм Π²Π΅Ρ€Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° увСдомлСния ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достаточно слоТной ΠΈ ΠΏΠΎ сути своСй Π½Π΅ являСтся логичСской Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ отсчСта Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π“ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΠΎΠ³ΠΈΡ‡Π½Π΅Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ отслСТивания ΠΈ информирования ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠ°ΠΊ абстрактный класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Ρ€Π°Π²Π½ΠΎΠΉ стСпСни ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ отсчСта Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚Π°ΠΊ ΠΈ с любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ с пСриодичСски ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π»ΡƒΡ‡ΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ созданиС абстрактного класса обозрСватСля Observer с чистой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Update().

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим Π²Ρ‚ΠΎΡ€ΠΎΠΉ абстрактный класс β€” Subject. Он содСрТит массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса Observer. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Π½Π΅ΠΌ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: Register(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рСгистрируСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса Observer, ΠΈ Notify(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отслСТиваСт измСнСния ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Π­Ρ‚Π° конструкция классов ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. Π’Π΅ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ измСнСния ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎ Π½ΠΈΡ…, Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ класса Observer. Класс Timer Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ наслСдуСтся ΠΎΡ‚ класса Subject. ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” itsSeconds) вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ Notify(), унаслСдованный ΠΎΡ‚ класса Subject.

НаконСц, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ класс ObserverTimer, унаслСдованный сразу ΠΎΡ‚ Π΄Π²ΡƒΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов β€” Observer ΠΈ Timer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ‡Π΅Ρ‚Π°Ρ‚ΡŒ Π² сСбС возмоТности ΠΎΡ‚ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ врСмя ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ± этом.

ΠŸΠ°Ρ€Π° слов ΠΎ мноТСствСнном наслСдовании, абстрактных Ρ‚ΠΈΠΏΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ языкС Java

МногиС программисты Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Π² основу языка Java ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ C++. Π’Π°ΠΊΠΆΠ΅ извСстно, Ρ‡Ρ‚ΠΎ создатСли языка Java ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ ΠΈΠ· Π½Π΅Π³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ мноТСствСнного наслСдования ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ, ΠΏΠΎ ΠΈΡ… мнСнию, это срСдство слишком услоТняСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ ΠΈΠ΄Π΅Ρ‚ Π² Ρ€Π°Π·Ρ€Π΅Π· с ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ упрощСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΎΠ², ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Π² основу Java. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния создатСлСй Java, 90% всСх возмоТностСй, прСдоставляСмых мноТСствСнным наслСдованиСм, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ интСрфСйса.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Java прСдставляСт собой Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ абстрактному Ρ‚ΠΈΠΏΡƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классах. Но Π½ΠΎΠ²Ρ‹Π΅ классы Π½Π΅ производятся нСпосрСдствСнно ΠΎΡ‚ интСрфСйса. ΠšΠ»Π°ΡΡΡ‹ производят ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… классов ΠΈ Π² Π½ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ интСрфСйса, Ρ‡Ρ‚ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ мноТСствСнноС наслСдованиС. Π’Π°ΠΊ, союз абстрактных классов ΠΈ мноТСствСнного наслСдования ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ» Π½Π° свСт Π°Π½Π°Π»ΠΎΠ³ классов- ΠΌΠ°Π½Π΄Π°Ρ‚ΠΎΠ², Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ услоТнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΎΠ², ΠΊΠ°ΠΊ Π² случаС с мноТСствСнным наслСдованиСм. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ интСрфСйсы Π½Π΅ содСрТат Π½ΠΈ выполняСмых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ², ΠΎΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ наслСдовании.

Насколько ΡƒΠ΄ΠΎΠ±Π½Ρ‹ ΠΈΠ»ΠΈ цСлСсообразны эти измСнСния, зависит ΠΎΡ‚ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π΅ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ программиста. Π’ΠΎ всяком случаС, Ссли Π²Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ΡΡŒ Π² мноТСствСнном наслСдовании ΠΈ абстрактных Ρ‚ΠΈΠΏΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… языка C++, Ρ‚ΠΎ это послуТит Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Π±Π°Π·ΠΎΠΉ ΠΏΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΈ освоСнии послСдних достиТСний ΠΈ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΉ программирования, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² языкС Java (Ссли Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ интСрСс ΠΊ Π½Π΅ΠΌΡƒ).

ИспользованиС логичСских конструкций Π² языках C++ ΠΈ Java ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассматриваСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅: Robert Martin, C++ and Java: А Critical Comparison // C++ Report. β€” January, 1997.

РСзюмС

БСгодня Π²Ρ‹ познакомились с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ прСодолСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ наслСдования. Π’Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎΠ± опасности ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π²Π²Π΅Ρ€Ρ… ΠΏΠΎ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ классов интСрфСйса ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΎΠ± ограничСниях привСдСния Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ классам Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΈ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ мноТСствСнноС наслСдованиС классов, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΈ этом ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ.