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/v8.1.0/Creating-a-Class.html