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
-
:
tf =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.
-
:
tf =ismethod(obj, method) -
:
tf =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–2026 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/v9.4.0/Creating-a-Class.html