8面向对象编程.docx
- 文档编号:3119960
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:14
- 大小:24.17KB
8面向对象编程.docx
《8面向对象编程.docx》由会员分享,可在线阅读,更多相关《8面向对象编程.docx(14页珍藏版)》请在冰点文库上搜索。
8面向对象编程
面向对象编程应用示例
1.类概念与定义
面向对象编程本质是利用一种包装技术,将复杂,不符合习惯的操作过程加以包装,向编程人提供简单的,符合习惯的表达形式,来完成编程。
面向对象编程,涉及到二个基本术语:
对象(object),类(class)。
对象(object):
具体的,个体的概念。
类(class):
抽象的,总体的的概念。
例如:
整数是一个类(class)。
1,1,2,4,123,875是整数类重的对象(object)。
对象(object),类(class)在生活中不是一个生疏的概念,类(class)的产生是一个抽象的过程。
具有一个共同的特征的一群事物即可构成一个类。
的对象(object),类(class)的概念往往是一个“反抽象的过程”。
生活中,一般是先有“对象”,后有“类”的。
面向对象编程中往往是先定义“类”,在有类去产生“对象”。
生活中的对象(object),类(class)的表达,类(class)是一种概念,存与思想中,对象(object)是具体的事物可以存与现实中或思想中。
面向对象编程中的对象(object),类(class)的表达必须存放在内存中。
例本例演示matlab定义类的基本方法。
(1)本例定义的类描述如下:
对于任何一个输入的对象,确定一个类对象,记录其类别,内容。
例如,输入矩阵
,取名为'MD',则被纪录的类别是double,内容是矩阵本身。
定义的类要有名称,可以查到。
(2)本例定义的类取名为‘objcls',其结构如下:
类别:
objcls
结构:
以序为数据;数据类型
类的要素:
类名(虚)、类结构、对象(实)、对象名、对象构成元。
以下程序(objcls.m)定义了这个类。
定义类的程序必须存于特殊的路径下。
本例的类路径是‘\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);
d=class(d,'objcls');
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)
fprintf('value=');disp(d.value)
elseiferror('absentornonthisclass')
end
display(mm)
name=double
value=12
34
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'符号类的定义目录,再进入'@sym'可以发现有关符号的运算的定义,其中就有'plus.m'的符号运算加法运算指令。
到c:
\matlab\toolsbox\fuzzy\可以看到'@mf'符号类的定义目录,再进入'@mf'可以发现有关符号的运算的定义,其中就有'plus.m'的模糊运算的加法运算指令。
在作加法时,首先判别对象,再到相应的路径下体取指令,作相应的运算。
这叫重载运算,指令叫重载函数。
对本例编制一个加法,来理解和体会“重载运算,重载函数”
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,'cell')
av={a.value};
end
if~strcmp(b.name,'cell')
bv={b.value};
end
d.value=[av;bv];
d.name=class(d.value);
d=class(d,'objcls');
p=[2,3,4];
mm=objcls(p);
q='asasas';
nn=objcls(q);
bb=mm+nn
typename=
double
typename=
char
name=cell
value=[1x3double]
'asasas'
查看bb的类别、内容:
1)读出bb的分项
编制如下程序:
function[rn,rv]=readobjcls(d)
ifnargin==1
rn=d.name;
cs=class(rn);
switchcs
case'cell'
rv=d.value;
case'double'
rv=d.value;
case'char'
rv=d.value;
end
elseiferror('absentornonthisclass')
end
[rn,rv]=readobjcls(bb)
rn=
cell
rv=
[1x3double]
'asasas'
2)读出value的分项,name和value
functionreadvalue(d)
ifnargin==1
rn=d.name;
rv=d.value;
crv=class(rv);
switchcrv
case'cell'
display(rv)
case'char'
display(rv)
case'double'
display(rv)
end
else
error('absentornonthisclass')
end
na=readobjcls(bb)
readvalue(bb)
na=
cell
rv=
[1x3double]
'asasas'
2.类的继承与应用
类的继承性(Inheritance)是面向对象编程的最重要的特性之一。
在创建新类时,利用这个特性,1)可以充分体现新类和其他类之间“逻辑”或“物理”上的内在关系,2)可以简化代码、提高软件的重复使用性。
减少工作量又提高软件质量。
与类的继承性有关的概念:
子类、父类
子类(childclass):
1).通过继承,得到一个或多个父类的结构架(structure),和相应的方法(methods&operations),2)通过自定义新的结构架(structure),和相应的方法(methods)得到自己特有的特点。
matlab如何实现子类对父类的继承,又如何实现子类自定义新的结构架和相应的方法?
下面用例子说明。
上面已经定义了objcls类,通过对objcls的继承产生新的类objclsson。
1)建立路径'@objclsson'
2)输入如下程序
functionds=objclsson(x)
superiorto('double','sparse','struct','cell','char','inline','sym');
d.value=x;%定义类objclsson
d.name=class(x);%
d.sign='ok';%添加新内容
num=nargin;
ifnum==1
g=objcls(x);
ds=class(d,'objclsson',g);%继承objcls类的所有功能(DISPLAY;运算规则的等)
else
error('Toomanyarguments.');
end
用类定义建立如下objclsson类对象
dd=objclsson([1,2])
name=double
value=12
objclsson类中的d.value,d.name成分的加法已经从objcls类得到了继承。
对于类的新成分d.sign的'+'运算要在PLUS中再加以定义。
dd1=objclsson([1,2]);
dd2=objclsson([3,4]);
dd1+dd2
name=cell
value=[1x2double]
[1x2double]
运行如下指令,产生类objclsson的对象nn。
p=[1,2;3,4];
nn=objclsson(p);
d=
value:
[2x2double]
name:
'double'
sign:
'ok'
检查nn的类名,显示nn的内容。
objclsson从objcls的继承了d.value,d.name成分的显示功能,由于没有对@objclsson编辑d.sign的'display',因此无法显示d.sign成分。
健入‘nn’,即可看到nn的内容。
class(nn)
nn
ans=
objclsson
name=double
value=12
34
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,'label','Axison');%产生Axison菜单项,由缺省设置而使能
h_sub2=uimenu(h_menu,'label','Axisoff',...
'enable','off');%产生Axisoff菜单项,但失能
h_sub3=uimenu(h_menu,'label','Gridon',...
'separator','on','visible','off');%产生与上分隔的Gridon菜单项,但不可见
h_sub4=uimenu(h_menu,'label','Gridoff',...
'visible','on');%产生Gridoff菜单项,但不可见
h_sub5=uimenu(h_menu,'label','回调操作',...
'visible','on');
set(h_sub1,'callback',[...%选中Axison菜单项后,产生回调操作
'Axison,',...%画坐标
'set(h_sub1,''enable'',''off''),',...%Axison菜单项失能
'set(h_sub2,''enable'',''on''),',...%Axisoff菜单项使能
'set(h_sub3,''visible'',''on''),',...%Gridon菜单项可见
'set(h_sub4,''visible'',''on''),']);%Gridoff菜单项可见
set(h_sub2,'callback',[...%%选中Axisoff菜单项后,产生回调操作
'axisoff,',...%使坐标消失
'set(h_sub1,''enable'',''on''),',...%Axison菜单项使能
'set(h_sub2,''enable'',''off''),',...%Axisoff菜单项失能
'set(h_sub3,''visible'',''off''),',...%Gridon菜单项不可见
'set(h_sub4,''visible'',''off''),']);%Gridoff菜单项不可见
set(h_sub3,'callback',[...%选中Gridon菜单项后,产生回调
'gridon,',...%画坐标分格线
'set(h_sub3,''enable'',''off''),',...%Gridon菜单项失能
'set(h_sub4,''enable'',''on''),']);%Gridoff菜单项使能
set(h_sub4,'callback',[...%选中Gridoff菜单项,产生回调
'gridoff,',...%消除坐标分格线
'set(h_sub3,''enable'',''on''),',...%Gridon菜单项使能
'set(h_sub4,''enable'',''off''),']);%Gridoff菜单项失能
set(h_sub5,'callback','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]);%设置图形窗大小
set(gcf,'defaultuicontrolunits','normalized');
set(gcf,'defaultuicontrolfontsize',11);
set(gcf,'defaultuicontrolfontname','宋体');
set(gcf,'defaultuicontrolhorizontal','left');
%set(gcf,'menubar','none');%删除图形窗工具条
str='石油预测';
set(gcf,'name',str,'numbertitle','off');%书写图形窗名
h_axes=axes('position',[0.05,0.15,0.45,0.70],'visible','on');%定义轴位框位置
%uicontrol(gcf,'Style','text',...%制作静态文本框
%'position',[0.52,0.87,0.10,0.1],...
%'String','影响长度');
%uicontrol(gcf,'Style','text',...%制作静态文本框
%'position',[0.52,0.60,0.10,0.1],...
%'String','预测长度');
hslider2=uicontrol(gcf,'Style','slider',...%制作滚动杆
'position',[0.6,0.67,0.20,0.1],...
'Max',200,'Min',0,...
'sliderstep',[0.01,0.05],...
'Value',0.5);
hslider1=uicontrol(gcf,'Style','slider',...%制作滚动杆
'position',[0.6,0.6,0.20,0.1],...
'Max',200,'Min',0,...
'sliderstep',[0.01,0.05],...
'Value',0.5);
set(hslider1,'callback','pp1');
set(hslider2,'callback','pp2');
%'Tag','slider2'
调用程序1:
程序名:
pp1.m
%functionpp1()
a=[5,2,3,1,2,6,1];
plot(a)
ppv=get(hslider1,'value');
uicontrol(gcf,'Style','text',...%制作静态文本框
'position',[0.12,0.20,0.10,0.1],...
'String',ppv);
'Tag','slider1'
调用程序2:
程序名:
pp2.m
%functionpp2()
a=[5,7,3,8,2,6,9];
plot(a)
ppv1=get(hslider2,'value');
uicontrol(gcf,'Style','text',...%制作静态文本框
'position',[0.52,0.87,0.10,0.1],...
'String',ppv1);
'Tag','slider2'
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 编程