среда, 25 июля 2007 г.

X++: абстрактный класс

[id:032]

Создаем абстрактный класс и метод в нем (внимание на ключевое слово "abstract"): abstract class BLG32_AbstractClass { int iMyVar; int MyMethod() { return iMyVar + 100; } }

Еще класс с методом main(): class BLG32_Class { static void main(Args _args) { BLG32_AbstractClass cls; cls = new BLG32_AbstractClass(); } }

Что получил? Ошибка компиляции. На то он и абстрактный, что нельзя создать объект этого класса.
Исправляем ошибку. Для этого сделаем класс BLG32_Class наследником от BLG32_AbstractClass и будет обращаться к реальному классу, а не какой-то там абстракции: class BLG32_Class extends BLG32_AbstractClass { static void main(Args _args) { BLG32_AbstractClass cls; cls = new BLG32_Class(); print cls.MyMethod(); pause; } }

Я увидел цифру 100. А ведь мы даже не переопределяли метод MyMethod() в классе BLG32_Class! А все потому, что MyMethod() вполне реальный метод, несмотря на то, что класс, где он размещен, абстрактный.
Экспериментируем дальше, сделай метод MyMethod() абстрактным: abstract class BLG32_AbstractClass { int iMyVar; abstract int MyMethod() { // Абстрактный метод должен быть пустым, иначе - заругають! //return iMyVar + 100; } }

Заметь, я отчистил тело метода.
А в классе BLG32_Class я переопределил метод: class BLG32_Class extends BLG32_AbstractClass { int MyMethod() { return iMyVar + 1000; } static void main(Args _args) { BLG32_AbstractClass cls; cls = new BLG32_Class(); print cls.MyMethod(); pause; } }

Результат: цифра 1000.

Итак:

  • в неабстрактный метод абстрактного класса можно что-нибудь написать
  • тело абстрактного метода должно быть пустым (как у интерфейса)
  • в отличие от наследования интерфейса, при наследовании от абстрактного класса начинает работать полезный пункт «Перекрыть метод». Попробуй:
    Переименуй метод MyMethod() во что-нибудь другое. Щелкни правой клавишей в окне проекта на классе BLG32_Class, пункт «Перекрыть метод» и тебе откроется список методов, доступных для перегрузки. Не правда ли, это хорошая возможность поберечь свои пальцы?

Комментариев нет: