Matlab笔记-第十一章
- 类与对象
-
- 类与对象
-
- 类对象属性特性和类对象方法特性
-
- 类对象属性特性
- 类对象方法特性
- event和listen还没说
类与对象
画布对象
fig1 = figure(1); % 画布 属性matlab.ui.Figure
fig1.Color = [1 0 0]; % 修改画布的颜色
fig1.Position = [40 378 560 420]; % 修改画布在屏幕上的位置
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; % 当前坐标系
创建对象
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); % 创建对象
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;计算
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)
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); %
继承
% 父类
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类
% 父类
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是代表类
-
例子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
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
类对象方法特性
% 父类
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
% 父类
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还没说