Spec-Zone.ru › Octave 6

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 является объектом класса.

См. также: class, typeinfo, isa, ismethod, isprop.

Доступные методы класса можно отобразить с помощью функции 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.

См. также: isprop, isobject, isjava, methods.

Для класса полиномов имеет смысл иметь метод для вычисления его корней.

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/v6.4.0/Creating-a-Class.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API