Matlab笔记-第十一章

Matlab笔记-第十一章

  • 类与对象
    • 画布对象
    • 创建对象
    • 继承
  • 类与对象
    • handle类
  • 类对象属性特性和类对象方法特性
    • 类对象属性特性
    • 类对象方法特性
    • event和listen还没说

类与对象

画布对象

fig1 = figure(1); % 画布 属性matlab.ui.Figure
fig1.Color = [1 0 0]; % 修改画布的颜色
fig1.Position = [40 378 560 420]; % 修改画布在屏幕上的位置

Matlab笔记-第十一章_第1张图片

fig1 = figure(1);
plot(rand(1,10));
%{		
			 XLim: [1 10]
             YLim: [0.1000 1]
           XScale: 'linear'
           YScale: 'linear'
    GridLineStyle: '-'
         Position: [0.1300 0.1100 0.7750 0.8150] % 就是坐标轴在画布上的x13%大小,y11%大小
            Units: 'normalized'
%}
ax1 = fig1.Children;
line1 = ax1.Children; % 坐标的孩子就是一条线
hold on; % 画布开启重叠
% 意思(2,0.8) (2,0.6) (4,0.6) (4,0.8)画一个矩形逆时针画
fill1 = fill([2 2 4 4],[0.8 0.6 0.6 0.8],'y'); % 属性matlab.graphics.primitive.Patch 和line是同等级

line1.Parent; % line1的母对象为ax1
fig1.Parent; % fig1的母对象为Graphics,Graphics画布的管理者
  • 画线
line1 = plot(rand(1,10)); % 创建一条线 属性matlab.graphics.chart.primitive.Line
  • 当前画布
current_fig = gcf; % 当前画布
current_axe = gca; % 当前坐标系

创建对象

  • 例子1-创建对象MyClassName
classdef MyClassName
    
    properties
        prop1
        prop2=datestr(now); % clear all才能删除matlab所以的存储的内存;clear不能删除matlab的记忆
    end
    
    methods
    
        function obj = MyClassName(val1,val2)
            if nargin == 2 % 如果有两个参数再赋值
                obj.prop1 = val1;
                obj.prop2 = val2;
            end
        end
        
    end
    
end
% 对象的属性只能修改,不能增加

% 调用
MCN1=MyClassName(1,2); % 创建对象
  • 例子2-创建对象SimpleClass
classdef SimpleClass
    
    properties
        x;
        y=33;
    end
    
    methods
    
        function obj = SimpleClass(varargin)
            if nargin == 0
                obj.x = 0;
            elseif nargin == 1
                obj.x = varargin{1};
            else
                obj.x = varargin{1};
                obj.y = varargin{2};
            end
        end
        
        function outarg = ordMethod(obj,arg1)
            outarg = obj.x + obj.y + arg1;
        end
    end
    
end

%% 调用
newobj = SimpleClass(99);
ordMethod(newobj,3); % outarg = obj.x + obj.y + arg1;计算
  • 例子3算法重写或者重载overloading
classdef threeNote1
    
    properties
        prop1;
        prop2; % clear all才能删除matlab所以的存储的内存;clear不能删除matlab的记忆
    end
    
    methods
    
        function obj = threeNote1(val1,val2)
            if nargin == 2 % 如果有两个参数再赋值
                obj.prop1 = val1;
                obj.prop2 = val2;
            end
        end
        
        function objout = plus(obj1,obj2) % 函数的重写
            objout = threeNote1;
            objout.prop1 = obj1.prop1 + obj2.prop2;
        end
        
    end
    
end

%% 调用
a1 = threeNote1(1,2);
a2 = threeNote1(3,4);
a1 + a2; % 函数的plus方法的重写相当于,plus(a1,a2)
  • 例子4-重写比原来好的方法
classdef Rectangle
    
    properties
        len = 0;
        width = 0;
    end
    
    methods
        
        function obj = Rectangle(l,w)
            if nargin == 2
                obj.len = l;
                obj.width = w;
            end
        end

        function outarg = rectarea(obj)
            outarg = obj.len * obj.width;
        end

        function out = lt(obj1,obj2)
            % out = rectarea(obj1) < rectarea(obj2);
            out = lt(rectarea(obj1),rectarea(obj2));
        end
        
        % 这里的函数是
        function out = gt(obj1,obj2)
            if isa(obj2,'Rectangle') % 如果obj2是对象就创建一个新的矩形
                out = gt(rectarea(obj1),rectarea(obj2));
            else
                inp2 = Rectangle(obj2,1);
                out = gt(obj1,inp2);
            end
        end
    
    end
end

%% 调用
re1 = Rectangle(1,2);
gt(re1,3); % 

继承

  • 例子1
% 父类
classdef Rectangle
    
    properties
        prop1;
        prop2;
    end
    
    methods
        function obj = Superclass(val1 ,val2)
            obj.prop1 = val1;
            obj.prop2 = val2;
        end
    end
    
end

% 子类
classdef MySubclass < Superclass % 这里的<是继承的意思
    properties
        prop3
    end
    function obj.MySubclass(val1,val2,val3)
        obj@Superclass(val1,val2); % 父类继承子类的方法用@
        obj.prop3 = val3;
    end
end
  • 变量表中寻找一个变量
exist('MS1','var'); % 有没有一个叫MS1的var变量,存在就返回1

类与对象

handle类

  • 例子1-自定义类继承handle
% 父类
classdef Rectangle < handle
    
    properties
        prop1;
        prop2;
    end
    
    methods
        function obj = Superclass(val1 ,val2)
            obj.prop1 = val1;
            obj.prop2 = val2;
        end
    end
    
end

%% 调用
%当一个类继承handle的时候;普通的赋值
rect1 = Superclass(1,2);
rect2 = rect1; % 其实就是类似一个茶杯两个手柄的,就是一个内存两个指针
rect2.prop1 = 10; % rect1.prop1 = 10; 一般是两个类有相对的独立性,改变一个值,另一个值不会改变
% 但是当类继承handle,那么,两个类的内存是一样的

类对象属性特性和类对象方法特性

类对象属性特性

  • public等优先级,obj是代表类
    Matlab笔记-第十一章_第2张图片

  • 例子1-public等

%% 父类
classdef threeNote1
    properties
        num = 0;
    end
    
    % Access为protected,子类的不能访问,内部可以访问,外部不能访问;
    % private子类可以访问,内部也可以访问,外部不能访问;
    % public子类可以访问,内部也可以访问,外部能访问;
    
    % SetAccess是private,protected只读属性
    % GetAccess是private外部看不见该属性
    % GetAccess是protected外部看不见该属性
    properties (GetAccess = protected)
        word = 'hello';
    end
    
    methods
        function obj = threeNote1(n,w)
            if nargin == 2
                obj.num = n;
                obj.word = w;
            end
        end
    end
    
end

%% 子类
classdef test1 < threeNote1
    methods
        function changeNum(obj,num)
            obj.num = num;
        end
        function changelord(obj ,word)
            obj.word = word;
        end
    end
end
  • 例子2-重设set
classdef threeNote1
    properties
        num = 0;
    end
    
    % Access为protected,子类的不能访问,内部可以访问,外部不能访问;
    % private子类可以访问,内部也可以访问,外部不能访问;
    % public子类可以访问,内部也可以访问,外部能访问;
    
    % SetAccess是private,protected只读属性
    % GetAccess是private外部看不见该属性
    % GetAccess是protected外部看不见该属性
    properties (GetAccess = protected)
        word = 'hello';
    end
    
    methods
        function obj = threeNote1(n,w)
            if nargin == 2
                obj.num = n;
                obj.word = w;
            end
        end
        
        function obj = set.num(obj,val) % tN1.num = 9,重设set
            if val >= 8 && val <= 180
                obj.num = val;
            else
                error('num not in range');
            end
        end
    end
    
end

类对象方法特性

  • Abstract抽象类对象方法
% 父类
classdef threeNote1
    properties
        num = 0;
    end
    
    methods (Abstract)
        function curve
        end
    end
end

% 子类
classdef test1 < threeNote1
    methods
        function curve % 抽象类重写父类方法
            obj.num = 123;
        end
    end
end
  • Hidden抽象类
% 父类
classdef threeNote1
    properties
        num = 0;
    end
    
    methods (Hidden)
        function curve
        	disp(123);
        end
    end
end

%% 调用
tN1 = threeNote1;
method(tN1); % 不会出现curve,但是可以调用tN1.curve;
  • Sealed修饰的方法不能再被子类重新定义
  • Static类方法调用
% 父类
classdef threeNote1
    properties
        num = 0;
    end
    
    methods (Static)
        function passOrFail = isPass(num)
            if num >= 60
                passOrFail = 'pass';
            else
                passOrFail = 'fail';
            end
        end
    end
end

%% 调用
threeNote1.isPass(60); % 直接用类调用,不用实例化调用

event和listen还没说

你可能感兴趣的:(matlab,开发语言)