编辑“︁
Modula-3
”︁(章节)
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
===面向对象=== Modula-3下的[[面向对象编程]],经常采用部份不透明类型,它通过如下惯用法来声明:{{code|2="objectpascal"|1=Type T <: Public; Public = OBJECT ... END}},这里的不透明类型<code>T</code>,支持在随后定义的对象类型中的字段和方法,而不会披露<code>T</code>的确切结构,也不披露<code>T</code>可能支持的其他方法。 下面的例子,定义一个接口<code>Person</code>,具有按习惯约定命名的两个类型,导出类型<code>T</code>,和公开对象类型<code>Public</code>,这里声明了<code>T</code>是<code>Public</code>的不透明[[子类型]],<code>Public</code>具有两个方法<code>getAge()</code>和<code>init()</code>;随后是<code>Person</code>接口的完全实现: <syntaxhighlight lang="objectpascal"> INTERFACE Person; TYPE T <: Public; Public = OBJECT METHODS getAge(): INTEGER; init(name: TEXT; age: INTEGER): T; END; END Person. </syntaxhighlight> <syntaxhighlight lang="modula2"> MODULE Person; REVEAL T = Public BRANDED OBJECT name: TEXT; age: INTEGER; OVERRIDES getAge := Age; init := Init; END; PROCEDURE Age(self: T): INTEGER = BEGIN RETURN self.age; END Age; PROCEDURE Init(self: T; name: TEXT; age: INTEGER): T = BEGIN self.name := name; self.age := age; RETURN self; END Init; BEGIN END Person. </syntaxhighlight> 要建立一个新的<code>Person.T</code>对象,要使用内建操作<code>NEW()</code>,并调用方法<code>init()</code>: <syntaxhighlight lang="modula2"> VAR jim := NEW(Person.T).init("Jim", 25); </syntaxhighlight> 下面是整数堆栈的例子: <syntaxhighlight lang="objectpascal"> INTERFACE IntegerStack; TYPE T <: Public OBJECT; Public = OBJECT METHODS init(): T; push(x: INTEGER); pop(): INTEGER; END; END IntegerStack. </syntaxhighlight> <syntaxhighlight lang="modula2"> MODULE IntegerStack; REVEAL T = Public BRANDED OBJECT n: INTEGER; a: REF ARRAY OF INTEGER; OVERRIDES init := Init; push := Push; pop := Pop; END; PROCEDURE Init(self: T): T = BEGIN self.n := 0; self.a := NIL; RETURN self END Init; PROCEDURE Push(self: T; x: INTEGER) = BEGIN IF self.a = NIL THEN self.a := NEW(REF ARRAY OF INTEGER, 5) ELSIF self.n > LAST(self.a^) THEN WITH temp = NEW(REF ARRAY OF INTEGER, 2 * NUMBER(self.a^)) DO FOR i := 0 TO LAST(self.a^) DO temp[i] := self.a[i] END; self.a := temp END END; self.a[self.n] := x; INC(self.n) END Push; PROCEDURE Pop(self: T): INTEGER = BEGIN DEC(self.n); RETURN self.a[self.n] END Pop; BEGIN END IntegerStack. </syntaxhighlight> 创建新堆栈在这里的部份不透明类型实现下为:{{code|2="modula2"|1=VAR myStack := NEW(IntegerStack.T).init()}},在上述的不透明类型实现下为:{{code|2="modula2"|1=VAR myStack := IntStack.Create()}}。而压入一个数在这里的部份不透明类型实现下为:{{code|2="modula2"|1=myStack.push(8)}},在上述的不透明类型实现下为:{{code|2="modula2"|1=IntStack.Push(myStack, 8)}}。
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息