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–2023 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.2.0/Creating-a-Class.html