Classdef and objects
Define classes and objects in Scilab scripts
Classdef are used to define a set of properties and/or methods that work together. Properties are like variables and methods like functions.
classdef <classname> < <superclass> & <superclass> properties (<modifiers>) var1 = [] end methods (<modifiers>) function <classname>(args...) // constructor ... end function rets=func1(args...) ... end func2 = externalfunc end enumeration enum1(args...) enum2(args...) enum3(args...) end end
Classes are defined by :
Properties and Methods can have some modifiers to change their visibility or behavior:
Private: elements can be used only inside methods of this class.
(Public/Protected/Private are exclusive)
Protected: elements can be used inside methods of this class and its children (inheritance).
(Public/Protected/Pritave are exclusive)
Public (default): elements can be used outside and inside of this class.
(Public/Protected/Pritave are exclusive)
Classes can derive from one or multiple classes. (with &)
In this case, elements of the parent classes can be used in this class (depends of the modifiers)
classdef <classname> < <superclass> & <superclass> end
Define properties of class.
Visibility modifier can be private, protected or public.
A default value can be added to initialize variable during instantiation (default [])
classdef <classname> properties (<modifier>) var1 = [] end end
Define methods of class.
Visibility modifier can be private, protected or public.
In methods this must be used to access to properties or methods of the object
classdef <classname> methods (<modifier>) function rets=func(args...) this.var1 = 12; end func2 = externalfunc end end
Note: externalfunc can be a macro or a C/C++ gateway.
In C/C++ gateway, use symbol::Context::getInstance()->getCurrentObject() to get this
Define enumeration of class.
They are specific instances of the class associated to a name.
classdef Color enumeration RED (args...) GREEN (args...) BLUE (args...) end end //usage Color.RED Color.GREEN Color.BLUE
Overloads will be called for undefined operations or function calls. (overloading)
There is 2 forms:External: defining an overload function %type1_operator_type2 for operators (standard overload way in Scilab)
Or %type_function for functions
Internal: using methods declaration in classdef
For functions, define a method with the same name (ex: disp in following example)
There is special functions called by internal mecanism like:
saveobj: call when saving an object to serialize data.
prototype: function data=saveobj(), end
You have to return a native scilab variable (struct, list, ...) except objects that contains all data you want to save.
loadobj: called when object is restore by load function.
prototype: function loadobj(data), end
data is the variable returned by saveobj.
delete: called when object is cleared
prototype: function delete(), end
For operators following the lookup table :
| Operations | Methods to define | Operations | Methods to define | Operations | Methods to define | Operations | Methods to define |
a + b |
plus(a, b) | +a | uplus(a) | a - b | minus(a, b) | -a | uminus(a) |
| a * b | mtimes(a, b) | a / b | mrdivide(a, b) | a \ b | mldivide(a, b) | a ^ b | mpower(a, b) |
| a .* b | times(a, b) | a ./ b | rdivide(a, b) | a .\ b | ldivide(a, b) | a .^ b | power(a, b) |
| a .*. b | kron(a, b) | a ./. b | rkron(a, b) | a .\. b | lkron(a, b) | ||
| a *. b | controltimes(a, b) | a /. b | controlrdivide(a, b) | a \. b | controlldivide(a, b) |
| Comparisions | Methods to define | Comparisions | Methods to define |
| a == b | eq(a, b) | a <> b | ne(a, b) |
| a < b | lt(a, b) | a <= b | le(a, b) |
| a > b | gt(a, b) | a >= b | ge(a, b) |
| a & b | and(a, b) | a | b | or(a, b) |
| a && b | shortand(a, b) | a || b | shortor(a, b) |
| Operations | Methods to define | Operations | Methods to define | Operations | Methods to define |
| ~a | not(a) | a' | ctranspose(a) | a.' | transpose(a) |
| Matrix manipulations | Methods to define | Matrix manipulations | Methods to define |
| [a b] | horzcat(a, b) | [a;b] | vertcat(a, b) |
| a(i1, i2, ...) | extract(i1, i2, ...) | a(i1, i2, ...) = b | insert(i1, i2, ..., b) |
for the most part of overload, you can definie a specific one for a identitified type.
ex: insert_s (insertion of a double in the object).
generic one will be used if specific one does not exist.
Search order is: specific (insert_s), generic (insert), scilab standard (%type1_i_type2)
classdef Matrix properties value = [] end methods function Matrix(v) this.value = v; end function r=plus(a, b) //generic overload for operation + if isa(a, "Matrix") & isa(b, "Matrix") then r = Matrix(a.value + b.value); else error(sprintf("Operation + not defined for %s and %s.\n", typeof(a), typeof(b))); end end function r=plus_s(a, b) //overload for Matrix + double or double + Matrix if isa(a, "Matrix") then r = Matrix(a.value + b); else r = Matrix(a + b.value); end end function r=plus_i(a, b) //overload for Matrix + int or int + Matrix if isa(a, "Matrix") then r = Matrix(a.value + double(b)); else r = Matrix(double(a) + b.value); end end function disp() disp(this.value); end end end a = Matrix([1 2 3 4]); b = Matrix([4 3 2 1]); a + b a + 10 10 + b a + int8(10) int8(10) + b | ![]() | ![]() |
Usage of enumeration:
classdef Color properties R G B end methods function Color(varargin) s = size(varargin); select (s) case 1 c = varargin(1); [_, _, _, colors] = regexp(c, "/([0-9A-Fa-f]{1,2})([0-9A-Fa-f]{1,2})([0-9A-Fa-f]{1,2})/"); colors = hex2dec(part(colors + colors, 1:2)); this.R = colors(1); this.G = colors(2); this.B = colors(3); case 3 this.R = modulo(varargin(1), 256); this.G = modulo(varargin(2), 256); this.B = modulo(varargin(3), 256); end end function disp() printf("Color: #%02x%02x%02x\n", this.R, this.G, this.B); end end enumeration BLACK ( 0, 0, 0) BLUE ( 0, 0, 255) GREEN ( 0, 255, 0) CYAN ( 0, 255, 255) RED (255, 0, 0) MAGENTA (255, 0, 255) YELLOW (255, 255, 0) WHITE (255, 255, 255) end end red = Color.RED gray1 = Color(128, 128, 128) gray2 = Color("#808080") | ![]() | ![]() |
| Version | Description |
| 2026.0.0 | classdef introduction. |