8面向对象编程.docx

上传人:b****2 文档编号:3119960 上传时间:2023-05-05 格式:DOCX 页数:14 大小:24.17KB
下载 相关 举报
8面向对象编程.docx_第1页
第1页 / 共14页
8面向对象编程.docx_第2页
第2页 / 共14页
8面向对象编程.docx_第3页
第3页 / 共14页
8面向对象编程.docx_第4页
第4页 / 共14页
8面向对象编程.docx_第5页
第5页 / 共14页
8面向对象编程.docx_第6页
第6页 / 共14页
8面向对象编程.docx_第7页
第7页 / 共14页
8面向对象编程.docx_第8页
第8页 / 共14页
8面向对象编程.docx_第9页
第9页 / 共14页
8面向对象编程.docx_第10页
第10页 / 共14页
8面向对象编程.docx_第11页
第11页 / 共14页
8面向对象编程.docx_第12页
第12页 / 共14页
8面向对象编程.docx_第13页
第13页 / 共14页
8面向对象编程.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

8面向对象编程.docx

《8面向对象编程.docx》由会员分享,可在线阅读,更多相关《8面向对象编程.docx(14页珍藏版)》请在冰点文库上搜索。

8面向对象编程.docx

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'

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2