34.1 Создание класса
В этой главе иллюстрируются пользовательские классы и объектно-ориентированное программирование на примере класса, предназначенного для полиномов. Этот класс был выбран за простоту, которая не отвлекает необоснованно от обсуждения функций программирования в Octave. Тем не менее, для начала необходимо немного информации о целях класса полиномов, прежде чем перейти к синтаксису и техникам объектно-ориентированного программирования в Octave.
Класс полиномов используется для представления полиномов вида
a0 + a1 * x + a2 * x^2 + … + an * x^n
где a0, a1 и т. д. — вещественные скаляры. Таким образом, полином можно представить вектором
a = [a0, a1, a2, …, an];
Это достаточное описание для начала написания конструктора класса полиномов. Все классы в Octave должны располагаться в директории, имя которой предваряется символом «@». Например, класс полиномов будет содержать все свои методы в директории «@polynomial».
Конструктор класса должен иметь имя самого класса; в этом примере конструктор находится в файле «@polynomial/polynomial.m». В идеале, даже когда конструктор вызывается без аргументов, он должен возвращать допустимый объект. Конструктор для класса полиномов может выглядеть следующим образом
## -*- texinfo -*-
## @deftypefn {} {} polynomial ()
## @deftypefnx {} {} polynomial (@var{a})
## Create a polynomial object representing the polynomial
##
## @example
## a0 + a1 * x + a2 * x^2 + @dots{} + an * x^n
## @end example
##
## @noindent
## from a vector of coefficients [a0 a1 a2 @dots{} an].
## @end deftypefn
function p = polynomial (a)
if (nargin == 0)
p.poly = 0;
p = class (p, "polynomial");
else
if (isa (a, "polynomial"))
p = a;
elseif (isreal (a) && isvector (a))
p.poly = a(:).'; # force row vector
p = class (p, "polynomial");
else
error ("@polynomial: A must be a real vector");
endif
endif
endfunction Обратите внимание, что возвращаемое значение конструктора должно быть результатом выполнения функции class. Первый аргумент функции class — структура, а второй — имя класса. Пример вызова конструктора класса для создания экземпляра:
p = polynomial ([1, 0, 1]);
Методы определяются m-файлами в директории класса и могут содержать встроенную документацию, как и любой другой m-файл. Справка по конструктору может быть получена, используя только имя конструктора, то есть для конструктора полиномов help polynomial вернёт строку справки. Справку по конкретному классу можно получить, используя имя директории класса, за которым следует имя метода. Например, help @polynomial/polynomial — ещё один способ отображения строки справки для конструктора полиномов. Этот второй способ является единственным способом получения справки по перегруженным методам и функциям класса.
Тот же механизм спецификации может быть использован там, где Octave ожидает имя функции. Например, type @polynomial/disp выведет на экран код метода disp класса полиномов, а dbstop @polynomial/disp установит точку останова в первой исполняемой строке метода disp класса полиномов.
Чтобы проверить, принадлежит ли переменная пользовательскому классу, можно использовать функции isobject и isa. Например:
p = polynomial ([1, 0, 1]); isobject (p) ⇒ 1 isa (p, "polynomial") ⇒ 1
- : isobject (x) ¶
-
Возвращает true, если x является объектом класса.
Доступные методы класса можно отобразить с помощью функции methods.
- : methods (obj) ¶
- : methods ("classname") ¶
- : methods (…, "-full") ¶
- : mtds = methods (…) ¶
-
Выводит имена общедоступных методов для объекта obj или именованного класса classname.
obj может быть объектом Octave-класса или объектом Java. classname может быть именем Octave-класса или Java-класса.
Если задан необязательный аргумент
"-full", Octave возвращает полные сигнатуры методов, которые включают тип возвращаемого значения, имя метода и количество и типы входных данных.Если вызов производится без аргумента вывода, то
methodsвыводит на экран список имён методов. В противном случае, аргумент вывода mtds содержит список в массиве ячеек строк.См. также: ismethod, properties, fieldnames.
Чтобы узнать, существует ли определённый метод для пользовательского класса, можно использовать функцию ismethod.
- : ismethod (obj, method) ¶
- : ismethod (class_name, method) ¶
-
Возвращает true, если строка method является допустимым методом объекта obj или класса clsname.
Для класса полиномов имеет смысл иметь метод для вычисления его корней.
function r = roots (p) r = roots (fliplr (p.poly)); endfunction
Мы можем проверить существование метода roots вызвав:
p = polynomial ([1, 0, 1]); ismethod (p, "roots") ⇒ 1
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v7.2.0/Creating-a-Class.html