Абстрактные классы и методы
Класс, содержащий абстрактные методы, называется абстрактным классом. Такие классы помечаются ключевым словом abstract.
Абстрактный метод не завершён. Он состоит только из объявления и не имеет тела:
abstract void yourMethod();
По сути, мы создаём шаблон метода. Например, можно создать абстрактный метод для вычисления площади фигуры в абстрактном классе Фигура. А все другие производные классы от главного класса могут уже реализовать свой код для готового метода. Ведь площадь у прямоугольника и треугольника вычисляется по разным алгоритмам и универсального метода не существует.
Если вы объявляете класс, производный от абстрактного класса, но хотите иметь возможность создания объектов нового типа, вам придётся предоставить определения для всех абстрактных методов базового класса. Если этого не сделать, производный класс тоже останется абстрактным, и компилятор заставит пометить новый класс ключевым словом abstract.
Можно создавать класс с ключевым словом abstract даже, если в нем не имеется ни одного абстрактного метода. Это бывает полезным в ситуациях, где в классе абстрактные методы просто не нужны, но необходимо запретить создание экземпляров этого класса.
В тоже время абстрактный класс не обязательно должен иметь только абстрактные методы. Напомню ещё раз, что если класс содержит хотя бы один абстрактный метод, то он обязан быть сам абстрактным.
Создавать объект на основе абстрактного класса нельзя.
// нельзя. даже не пытайтесь AbstractClass abstractClass = new AbstractClass();
Абстрактный класс не может содержать какие-либо объекты, а также абстрактные конструкторы и абстрактные статические методы. Любой подкласс абстрактного класса должен либо реализовать все абстрактные методы суперкласса, либо сам быть объявлен абстрактным. Короче, я сам запутался. Пойду лучше кота поглажу.
Я вернулся. Давайте напишем пример для абстрактного класса.
Допустим, мы хотим создать абстрактный класс СферическийКонь и не менее идиотский класс СферическийКоньВВакууме, наследующий от первого класса.
package ru.alexanderklimov.expresscourse; public abstract class SphericalHorse < // абстрактный метод ржать() abstract void neigh(); // абстрактный класс может содержать и обычный метод void gallop() < System.out.println("Куда прёшь?"); >> class SphericalHorseInVacuum extends SphericalHorse
Когда вы напишете такой код, то студия подчеркнёт второй класс красной волнистой линией и предложит реализовать обязательный метод, который определён в абстрактном классе.
Соглашаемся и дописываем в созданную заготовку свой код для метода.
@Override void neigh()
В главной активности напишем код для щелчка кнопки.
public void onClick(View view) < SphericalHorseInVacuum horse = new SphericalHorseInVacuum(); horse.neigh(); // на основе абстрактного метода horse.gallop(); // обычный метод >
Обратите внимание, что абстрактный класс может содержать не только абстрактные, но и обычные методы.
Раннее мы создавали класс Фигура, у которого был метод вычисления площади фигуры. Метод ничего не делал, так как невозможно вычислить площадь неизвестной фигуры. Поэтому, этот метод можно сделать абстрактным, а в классах, производных от Фигуры, переопределить данный метод.
// абстрактный класс Фигура abstract class Figure < double dim1; double dim2; Figure(double a, double b) < dim1 = a; dim2 = b; >// абстрактный метод для вычисления площади abstract double area(); > // Клас Треугольник class Triangle extends Figure < Triangle(double a, double b) < super(a, b); >// переопределяем метод double area() < return dim1 * dim2 / 2; >> // В активности public void onClick(View view) < // Figure figure = new Figure(10, 10); // так нельзя Triangle triangle = new Triangle(10, 8); Figure figure; // так можно, так как объект мы не создаем figure = triangle; mInfoTextView.append("Площадь равна " + figure.area()); >
Фигура — это абстрактное понятие и мы не можем создать универсальный метод для вычисления площади. Поэтому мы создаём другой класс Треугольник и пишем код, вычисляющий площадь треугольника (загляните в учебник геометрии). Также вы можете создать новый класс Прямоугольник и написать свой код для вычисления площади этой фигуры.
Вам вряд ли придётся часто создавать абстрактные классы для своих приложений, но встречаться с ними вы будете постоянно, например, классы AsyncTask, Service и др.
Кот — понятие тоже абстрактное. А вот ваш любимец Васька или Мурзик уже конкретный шерстяной засранец. По запросу «abstract cat» мне выдало такую картинку. Всегда интересовал вопрос, где художники берут такую травку? (это был абстрактный вопрос).
Абстрактные классы и методы
Абстрактные методы – это методы у которых отсутствует реализация.
аbstract тип имяМетода(списокПараметоров);
public abstract double calculateArea();
Абстрактные методы должны быть обязательно переопределены в подклассе.
Любой класс, содержащий один или больше абстрактных методов, должен быть также объявлен как абстрактный. Для этого достаточно указать ключевое слово abstract перед ключевым словом class в начале объявления класса:
public abstract class Figure2
У абстрактного класса в Java не может быть никаких объектов. Но абстрактные классы можно применять для создания ссылок на объекты. Например:
public abstract class Figure2 < . public abstract double calculateArea(); public static void main(String[] args) < // У абстрактного класса не может быть никаких объектов. // Figure2 figure1 = new Figure2(); // Но абстрактные классы можно применять для создания ссылок на объекты. Figure2 figure2 = new Rectangle(); >>
Также нельзя объявлять абстрактные конструкторы или абстрактные статические методы.
Рассмотрим пример использования абстрактных классов и методов на примере класса Figure и его наследников Triangle и Rectangle , которые мы рассматривали в Переопределение методов. Класс Figure описывает абстрактную фигуру, для которой вычисление площади не имеет смысла, поэтому метод calculateArea() более правильно сделать абстрактным.
public abstract class Figure2 < double dimension1; double dimension2; public Figure2(double dimension1, double dimension2) < this.dimension1 = dimension1; this.dimension2 = dimension2; >public abstract double calculateArea(); >
Любой подкласс, производный от абстрактного класса, должен реализовать все абстрактные методы из своего супер класса или же сам быть объявлен абстрактным:
public class Rectangle2 extends Figure2 < public Rectangle2(double dimension1, double dimension2) < super(dimension1, dimension2); >public double calculateArea() < System.out.println("B области четырехугольника."); return dimension1 * dimension2; >>
public class Triangle2 extends Figure2 < public Triangle2(double dimension1, double dimension2) < super(dimension1, dimension2); >public double calculateArea() < System.out.println("B области треугольника."); return dimension1 * dimension2 / 2; >>
У абстрактного класса не может быть объектов, но можно создать массив абстрактного класса, который будет содержать ссылки на объекты классов наследников:
public class FindAreas < public static void main(String[] args) < Figure[] figures = new Figure[3]; figures[0] = new Figure(10, 10); figures[1] = new Rectangle(10, 10); figures[2] = new Triangle(10, 10); for (Figure figure : figures) < double area = figure.caclulateArea(); System.out.println(area); >> >
Результат выполнения программы:
B области четырехугольника. 200.0 B области четырехугольника. 100.0 B области треугольника. 50.0
- Процедурное и объектно-ориентированное программирование
- Принципы ООП
- Классы и объекты
- Конструктор
- Ключевое слово this
- Перегрузка
- Стек и куча
- Передача объектов в методы
- Java varargs
- Рекурсия
- Сборщик мусора и метод finalize
- Наследование
- Ключевое слово super
- Модификаторы доступа
- Геттеры и сеттеры
- Переопределение методов
- Ключевое слово final
- Задания
Абстрактный метод
Абстра́ктный ме́тод (или чистый виртуальный метод (pure virtual method — часто неверно переводится как чисто виртуальный метод)) — в объектно-ориентированном программировании, метод класса, реализация для которого отсутствует. Класс, содержащий абстрактные методы, также принято называть абстрактным (там же и пример). Абстрактные методы зачастую путают с виртуальными. Абстрактный метод подлежит определению в классах-наследниках, поэтому его можно отнести к виртуальным, но не каждый виртуальный метод является абстрактным.
Назначение
Абстрактный метод ничего не делает, но определяет параметры и возвращаемое значение.
Назначение абстрактных методов [1] :
- описание абстракции, которая не в более конкретизированном виде не может быть реализована;
- формальное (без реализации — есть или нет) удовлетворение требований о наличии статических методов при обращении к ним для прохождения проверки компилятора статической типизации, когда реализация их будет определена динамически (в процессе работы программы).
Примеры
С#
abstract type method_name(params);//определение в родительском классе override method_name(params). >;//определение в дочернем классе
C++
virtual void Abstr ( void ) = 0; // Чистая (пустая) виртуальная функция.
Delphi
procedure AbstractProcedure; abstract;
Литература
- Антон ЗлыгостевОбработка абстрактных методов в Delphi (рус.) // RSDN Magazine. — 2003. — № 2. АБСТРАКЦИЯ (от лат. abstraho – отвлекать, исключать, отделять) – необходимое условие познания путем формирования «вторичных образов» реальности (ее информационных моделей), в частности, таких, как восприятия, представления, понятия, теории и прочее. В процессе абстракции осуществляется выбор и обработка информации с целью заменить непосредственно данный эмпирический образ на другой, непосредственно не данный, но подразумеваемый и мыслимый как абстрактный объект и называемый обычно тем же термином «абстракция».
ОЧЕРК ИСТОРИИ. Современное понятие об абстракции восходит к Аристотелю, согласно которому абстрагирование – это метод намеренно одностороннего изучения реальности, субъективный прием мысленного разделения целого и полагание отдельно-сущими его частей. В принципе такое полагание не заключает «никакой ошибки» и объективно оправдано многообразием свойств (аспектов) целого, порою столь различных, что они не могут стать предметом, одной науки. Наука же, по Аристотелю, исследует общее, а общее познается посредством абстракции. Поэтому абстракция не только является основной предпосылкой научного познания, но и «создает науку». В этом смысле преходящие явления опыта важны не сами по себе, а в той мере, в какой они причастны к какой-либо абстракции. Аристотель также отличал эмпирические абстракции от теоретических, полагая, что последние необходимы там, где постигаемое мыслью и сама мысль неотделимы друг от друга (как, напр., в математике, где знание и предмет знания по существу совпадают).
См. также
Ссылки
- ↑Бадд Т. 14.6. Отложенные методы //Глава 14. Полиморфизм // Объектно-ориентированное программирование.
abstract (Справочник по C#)
Модификатор abstract указывает, что изменяемый элемент имеет отсутствующую или неполную реализацию. Модификатор abstract можно использовать с классами, методами, свойствами, индексаторами и событиями. Используйте модификатор abstract в объявлении класса, чтобы указать, что класс предназначен только для использования в качестве базового класса для других классов и не должен быть создан сам по себе. Элементы с пометкой abstract должны быть реализованы не абстрактными классами, производными от абстрактного класса.
Пример 1
В этом примере класс Square должен обеспечивать реализацию GetArea , поскольку является производным от класса Shape :
abstract class Shape < public abstract int GetArea(); >class Square : Shape < private int _side; public Square(int n) =>_side = n; // GetArea method is required to avoid a compile-time error. public override int GetArea() => _side * _side; static void Main() < var sq = new Square(12); Console.WriteLine($"Area of the square = "); > > // Output: Area of the square = 144
Абстрактные классы предоставляют следующие возможности:
- Создавать экземпляры абстрактного класса нельзя.
- Абстрактный класс может содержать абстрактные методы и методы доступа.
- Изменить абстрактный класс с модификатором sealed нельзя, так как два этих модификатора имеют взаимоисключающие значения. Модификатор sealed запрещает наследование класса, в то время как модификатор abstract указывает, что класс обязан иметь производные классы.
- Неабстрактный класс, производный от абстрактного класса, должен включать фактические реализации всех наследуемых абстрактных методов и методов доступа.
Модификатор abstract в объявлении метода или свойства позволяет указать, что этот метод или свойство не содержат реализации.
Абстрактные методы предоставляют следующие возможности:
- Абстрактный метод неявно представляет собой виртуальный метод.
- Объявления абстрактных методов допускаются только в абстрактных классах.
- Поскольку объявление абстрактного метода не предоставляет фактической реализации, тело метода отсутствует, а объявление метода заканчивается точкой с запятой, и фигурных скобок (< >) после подписи нет. Например:
public abstract void MyMethod();
Действие абстрактных свойств аналогично абстрактным методам, за исключением отличий в синтаксисе объявлений и вызовов.
- Использование модификатора abstract в статическом свойстве является недопустимым.
- Абстрактное наследуемое свойство можно переопределить в производном классе, включив объявление свойства, которое использует модификатор override.
Дополнительные сведения об абстрактных классах см. в статье Abstract and Sealed Classes and Class Members (Абстрактные и запечатанные классы и члены классов).
Абстрактный класс должен предоставлять реализацию для всех членов интерфейса.
Абстрактный класс, реализующий интерфейс, может сопоставлять методы интерфейса с абстрактными методами. Например:
interface I < void M(); >abstract class C : I
Пример 2
В следующем примере класс DerivedClass является производным от абстрактного класса BaseClass . Абстрактный класс содержит абстрактный метод, AbstractMethod , и два абстрактных свойства, X и Y .
// Abstract class abstract class BaseClass < protected int _x = 100; protected int _y = 150; // Abstract method public abstract void AbstractMethod(); // Abstract properties public abstract int X < get; >public abstract int Y < get; >> class DerivedClass : BaseClass < public override void AbstractMethod() < _x++; _y++; >public override int X // overriding property < get < return _x + 10; >> public override int Y // overriding property < get < return _y + 10; >> static void Main() < var o = new DerivedClass(); o.AbstractMethod(); Console.WriteLine($"x = , y = "); > > // Output: x = 111, y = 161
В предыдущем примере при попытке создать экземпляр абстрактного класса с помощью оператора вида:
BaseClass bc = new BaseClass(); // Error
Выдается сообщение об ошибке, указывающее, что компилятор не может создать экземпляр абстрактного класса BaseClass.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
См. также
- Справочник по C#
- Руководство по программированию на C#
- Модификаторы
- virtual
- override
- Ключевые слова в C#
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.