8面向对象编程Word下载.docx
《8面向对象编程Word下载.docx》由会员分享,可在线阅读,更多相关《8面向对象编程Word下载.docx(14页珍藏版)》请在冰点文库上搜索。
本例的类路径是‘\matlab\work\@objcls'
functiond=objcls(x)
superiorto('
double'
'
sparse'
struct'
cell'
char'
inline'
sym'
);
num=nargin;
%输入的项目个数,最大数目不超过定义的数目,objcls(a,b,c,d,e)最大数目是5。
switchnum
case0
d.value=[];
d.name='
empty'
;
d=class(d,'
objcls'
case1
d.value=x;
d.name=class(x);
otherwise
error('
Toomanyarguments.'
end
在matlab环境下,运行以下指令,则可以定义此类的的一个具体的对象mm。
p=[1,2;
3,4];
q=class(p);
mm=objcls(p)
name=double
value=12
34
第三条指令,显示了类对象,但对于用户自己定义的类,matlab并不提供显示,必须有类的定义者自己编显示程序。
matlab规定,类的显示程序统一取名‘display.m'
与类定义程序放在同一路径之下。
因此,定义类至少有二个程序组成:
1。
类定义程序、2。
类显示程序display。
本例定义的类的显示程序display如下:
functiondisplay(d)
ifnargin==1
fprintf('
name='
disp(d.name)
value='
disp(d.value)
elseiferror('
absentornonthisclass'
)
end
display(mm)
2.重载运算
对于新类的对象,其运算与操作一般是自己特有的,运算符可以是通用的,运算与操作要有类自己决定。
例如加法,运算与操作符是'
add'
、'
+'
plus'
等。
通过和‘helpplus’可以得到多个'
plus.m'
指令。
sym/plus.m:
符号加法
demtseries/plus.m:
金融工具箱中的时间加法
mf/plus.m:
模糊运算的加法
zpk/plus.m:
零极点加法
tf/plus.m:
传递函数加法
等等。
到c:
\matlab\toolsbox\symbols\可以看到'
@sym'
符号类的定义目录,再进入'
可以发现有关符号的运算的定义,其中就有'
的符号运算加法运算指令。
\matlab\toolsbox\fuzzy\可以看到'
@mf'
的模糊运算的加法运算指令。
在作加法时,首先判别对象,再到相应的路径下体取指令,作相应的运算。
这叫重载运算,指令叫重载函数。
对本例编制一个加法,来理解和体会“重载运算,重载函数”
1)确定加法的意义和法则
objcls类有二个项目,数据d和数据类型t,设为d1,d2位二个objcls类的对象,表达为d1(a1,t1),d2(a2,t2)。
由于d1,d2的类型多不一样,d1+d2的意义和法则必须有类的设计者来确定。
定义d1+d2是objcls类设为d3(a3,t3),a3为'
cell,t3为2×
1元胞矩阵。
如:
d1=(double,(2,3,4));
d2=(char,'
asasas'
d1+d2=
编制程序
因此定义一种新的类,他的有关运算与操作必须一同定义下来,但'
display.m'
是必要有的。
functiond=plus(a,b)
av=a.value;
bv=b.value;
if~strcmp(a.name,'
av={a.value};
if~strcmp(b.name,'
bv={b.value};
d.value=[av;
bv];
d.name=class(d.value);
d=class(d,'
p=[2,3,4];
mm=objcls(p);
q='
nn=objcls(q);
bb=mm+nn
typename=
double
char
name=cell
value=[1x3double]
'
查看bb的类别、内容:
1)读出bb的分项
编制如下程序:
function[rn,rv]=readobjcls(d)
rn=d.name;
cs=class(rn);
switchcs
case'
rv=d.value;
end
[rn,rv]=readobjcls(bb)
rn=
cell
rv=
[1x3double]
2)读出value的分项,name和value
functionreadvalue(d)
crv=class(rv);
switchcrv
display(rv)
end
else
na=readobjcls(bb)
readvalue(bb)
na=
2.类的继承与应用
类的继承性(Inheritance)是面向对象编程的最重要的特性之一。
在创建新类时,利用这个特性,1)可以充分体现新类和其他类之间“逻辑”或“物理”上的内在关系,2)可以简化代码、提高软件的重复使用性。
减少工作量又提高软件质量。
与类的继承性有关的概念:
子类、父类
子类(childclass):
1).通过继承,得到一个或多个父类的结构架(structure),和相应的方法(methods&
operations),2)通过自定义新的结构架(structure),和相应的方法(methods)得到自己特有的特点。
matlab如何实现子类对父类的继承,又如何实现子类自定义新的结构架和相应的方法?
下面用例子说明。
上面已经定义了objcls类,通过对objcls的继承产生新的类objclsson。
1)建立路径'
@objclsson'
2)输入如下程序
functionds=objclsson(x)
d.value=x;
%定义类objclsson
d.name=class(x);
%
d.sign='
ok'
%添加新内容
ifnum==1
g=objcls(x);
ds=class(d,'
objclsson'
g);
%继承objcls类的所有功能(DISPLAY;
运算规则的等)
用类定义建立如下objclsson类对象
dd=objclsson([1,2])
value=12
objclsson类中的d.value,d.name成分的加法已经从objcls类得到了继承。
对于类的新成分d.sign的'
运算要在PLUS中再加以定义。
dd1=objclsson([1,2]);
dd2=objclsson([3,4]);
dd1+dd2
value=[1x2double]
[1x2double]
运行如下指令,产生类objclsson的对象nn。
nn=objclsson(p);
d=
value:
[2x2double]
name:
sign:
检查nn的类名,显示nn的内容。
objclsson从objcls的继承了d.value,d.name成分的显示功能,由于没有对@objclsson编辑d.sign的'
display'
因此无法显示d.sign成分。
健入‘nn’,即可看到nn的内容。
class(nn)
nn
ans=
objclsson
3)图形用户界面(GUI)类
(1)菜单的定义与调用,程序名:
mm.m
%菜单的定义与调用
clfreset
%set(H_fig,'
MenuBar'
none'
set(gcf,'
menubar'
menubar);
h_menu=uimenu('
label'
Option'
%产生顶层菜单项Option
h_sub1=uimenu(h_menu,'
Axison'
%产生Axison菜单项,由缺省设置而使能
h_sub2=uimenu(h_menu,'
Axisoff'
...
enable'
off'
%产生Axisoff菜单项,但失能
h_sub3=uimenu(h_menu,'
Gridon'
separator'
on'
visible'
%产生与上分隔的Gridon菜单项,但不可见
h_sub4=uimenu(h_menu,'
Gridoff'
%产生Gridoff菜单项,但不可见
h_sub5=uimenu(h_menu,'
回调操作'
set(h_sub1,'
callback'
[...%选中Axison菜单项后,产生回调操作
Axison,'
...%画坐标
'
),'
...%Axison菜单项失能
set(h_sub2,'
...%Axisoff菜单项使能
set(h_sub3,'
...%Gridon菜单项可见
set(h_sub4,'
]);
%Gridoff菜单项可见
[...%%选中Axisoff菜单项后,产生回调操作
axisoff,'
...%使坐标消失
...%Axison菜单项使能
...%Axisoff菜单项失能
...%Gridon菜单项不可见
%Gridoff菜单项不可见
[...%选中Gridon菜单项后,产生回调
gridon,'
...%画坐标分格线
...%Gridon菜单项失能
%Gridoff菜单项使能
[...%选中Gridoff菜单项,产生回调
gridoff,'
...%消除坐标分格线
...%Gridon菜单项使能
%Gridoff菜单项失能
set(h_sub5,'
mm1'
%选中Gridoff菜单项,产生回调
被调用的程序:
mm1.m
mm1
a=[2,7,45,7,4,65,3,53,5,34,34,34,9];
plot(a);
2)控件调用,程序名:
pp.m
matlab有“guid"
面向对象的界面,健入‘guid’弹出编辑界面。
也可以编程实现如下:
(例)
%控件调用pp.m
clfreset%set(gcf,'
unit'
normalized'
position'
[0.1,0.4,0.85,0.35]);
%设置图形窗大小
defaultuicontrolunits'
defaultuicontrolfontsize'
11);
defaultuicontrolfontname'
宋体'
defaultuicontrolhorizontal'
left'
%set(gcf,'
%删除图形窗工具条
str='
石油预测'
name'
str,'
numbertitle'
%书写图形窗名
h_axes=axes('
[0.05,0.15,0.45,0.70],'
%定义轴位框位置
%uicontrol(gcf,'
Style'
text'
...%制作静态文本框
%'
[0.52,0.87,0.10,0.1],...
String'
影响长度'
%'
[0.52,0.60,0.10,0.1],...
预测长度'
hslider2=uicontrol(gcf,'
slider'
...%制作滚动杆
[0.6,0.67,0.20,0.1],...
Max'
200,'
Min'
0,...
sliderstep'
[0.01,0.05],...
Value'
0.5);
hslider1=uicontrol(gcf,'
[0.6,0.6,0.20,0.1],...
set(hslider1,'
pp1'
set(hslider2,'
pp2'
Tag'
slider2'
调用程序1:
程序名:
pp1.m
%functionpp1()
a=[5,2,3,1,2,6,1];
plot(a)
ppv=get(hslider1,'
value'
uicontrol(gcf,'
[0.12,0.20,0.10,0.1],...
ppv);
slider1'
调用程序2:
pp2.m
%functionpp2()
a=[5,7,3,8,2,6,9];
ppv1=get(hslider2,'
ppv1);