Datové struktury a objektově orientované programování

Cíle

Cílem semináře je naučit se základy objektově orientovaného programování a základy práce s datovými strukturami v Matlabu.

Struktury

Struktury v Matlabu, podobně jako v jiných jazycích, umožňují seskupovat související data. K definici a pro přístup k jednotlivým polím struktury se používá tečková notace. Jednotlivá pole nemusjí mít stejný datový typ.

Příklad:

student.name = 'jim';
student.gpa  = 4.0;

Dále můžeme v matlabu vytvářet i pole struktur. Pro indexování těchto polí můžeme pooužívat chytré indexování jako u matic.

Příklad:

students(1).name  = 'jim';
students(1).age   = 21;
students(2).name  = 'Alex';
students(2).age   = 24;
students(3).name  = 'Janet';
students(3).age = 19;

Více ke strukturám zde. Srovnání struktur a polí typu cell array je pak možné si přečíst zde.

Objektově orientované programování

Třídy

Syntaxe:

classdef (attribute-name = expression, ...) MyClass
    body
end

Definice třídy začíná klíčovým slovem classdef. MyClass je název dřídy. Seznam unvitř kulatých závorek je nepovinný seznam atributů třídy. Pomocí nich lze například určit, zda se jedná o abstraktní třídu, jestli je umožněno z této třídy dědit atd.

V těle třídy dále mohou být definovány vlastnosti a metody.

Definice vlastností začíná klíčovým slovem properties a končí klíčovým slovem end:

properties (Attribute1 = value1, Attribute2 = value2,...)
    property1
end

Definice metod začíná klíčovým slovem methods a končí klíčovým slovem end.

methods (Attribute1 = value1, Attribute2 = value2,...)
    function ...
end

Třídy mohou obsahovat více bloků properties a methods. (Attribute1 = value1, Attribute2 = value2,...) je seznam atributů platných v daném bloku. Lze pomocí nich například definovat statické metody.

Pro třídy lze také vytvářet vlastní konstruktory. Ty lze vytvořit stejným postupem jako metody, stačí danou metodu pojmenovat stejně jako třídu, ve které se daná metoda nachazí.

Příklad:

classdef bod
%BOD priklad jednoduche tridy

    %verejne vlastnosti
    properties
        x;
        y;
    end

    % privatni vlastnosti
    properties (Access=private)
        barva;
    end

    methods
        % konstruktor
        function objekt=bod(x, y)
            objekt.x = x;
            objekt.y = y;
        end

        function barva = getBarva(objekt)
            barva = objekt.barva;
        end

        function objekt = setBarva(objekt, barva)
            objekt.barva = barva;
        end
    end
end

Dědičnost

Seznam tříd, ze kterých třída dědí se píše za jméno třídy.

classdef (attribute-name = expression, ...) MyClass < SuperClass1 & ... & SuperClassN

Příklad:

classdef PositiveDouble < double
    methods
        function obj = PositiveDouble(data)
            if nargin == 0
                data = 1;
            else
                mustBePositive(data)
            end
        obj = obj@double(data);
        end
    end
end