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 > 1)
print_usage ();
endif
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")
- mtds = methods (…)
-
Выводит список имен публичных методов для объекта obj или именованного класса classname.
obj может быть объектом Octave-класса или объектом Java. classname может быть именем Octave-класса или Java-класса.
При вызове без выходных аргументов,
methodsвыводит список имён методов на экран. В противном случае, выходной аргумент mtds содержит список в виде массива ячеек строк.См. также: fieldnames.
Чтобы узнать, существует ли определённый метод для пользовательского класса, можно использовать функцию ismethod.
- ismethod (obj, method)
- ismethod (clsname, 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/v5.2.0/Creating-a-Class.html