已经解释过,采用OOP一个最大的优势是代码复用,一个概念 DRY(don't repeat yourself)是很好的总结。实现代码重用的一个方式在理论上非常简单:当两个以上的类共享通用的代码片段,组织它们到函数并移动这些函数到一个基础的 super class。
继承从另一个角度可以看作层次结构树,在根部有一个通用的系统,以交通工具 为例,有更专门的系统,就像汽车或者船,在每个分支,层次都有一个无限数量的水平带有一些特定的角度。层次结构中每个新的水平都可以添加新的函数和变量:Vehicle 类可以有方法 accelerate() ,会被所有它的后代继承,子类 Car 会有一个变量 numberOfWheels 而在平辈的 Boat 类中不会出现。
毕竟,继承一个类意味着创建更多特定的功能,丰富已有的类。
每个类都可能是继承自不超过一个父类。这在OOP中是一个普遍的范式,称为单一继承;Haxe同样提供替代方式进行继承。
一个继承的类继承所有私有和共有的实例字段,而不是静态的那些。从其他OO语言来的人,如C#,私有访问修饰符是等价protected修饰符的。
在前面CMS的例子中,一个新的文章类被实现。它和BlogEntry类有很多共同点。都有一个 title,一个 content,一个except,当然还有一个发布方式。那么代码要重复两次吗?当然不是。一个通用的基类是必要的。这就是继承。
两个新的类被创建:Article 和BlogEntry,它们继承BaseEntry,并继承所有它的字段,而不会重复。
~~~
class BaseEntry
{
public var title(default,default) : String;
public var content(default,default) : String;
public var createdOn(default,null) : Date;
public var onlineInfo(getOnlineInfo,null) : String;
public var excerpt(getExcerpt, setExcerpt) : String;
private var definedExcerpt : String;
private var publishedOn : Date;
public function new (title : String, content : String)
{
this.title = title;
this.content = content;
createdOn = Date.now();
publishedOn = null;
}
private function getExcerpt() : String
{
if(definedExcerpt != null)
return definedExcerpt;
else
return content.substr(0, 10) + “ ...”;
}
private function setExcerpt(value : String) : String
{
definedExcerpt = value;
return definedExcerpt;
}
private function getOnlineInfo() : String
{
if(publishedOn == null)
return “Not yet on-line”;
else
{
// getTime() returns the time in milliseconds since 1970-01-01
// we have to divide the time span by 24 hours=24*60*60*1000=86400000
var daysOnline = (Date.now().getTime()-publishedOn.getTime())/86400000;
return if(daysOnline < 1)
“Published Today”;
else if(daysOnline < 2)
“Published Yesterday”;
else if(daysOnline < 7)
“Published “ + Math.floor(daysOnline) + “ days ago”;
else
“Published on “ + DateTools.format(publishedOn, “%Y-%m-%d”);
}
}
public function isOnline() : Bool
{
return publishedOn != null && publishedOn.getTime() < = Date.now().getTime();
}
public function publish() : Void
{
publishedOn = Date.now();
}
public function unpublish() : Void
{
publishedOn = null;
}
}
class BlogEntry extends BaseEntry { }
class Article extends BaseEntry { }
~~~
- 本书目录
- 第一章:Haxe介绍
- 互联网开发的一个问题
- Haxe是什么,为什么产生
- Haxe编译工具
- Haxe语言
- Haxe如何工作
- 那么Neko是什么
- Haxe和Neko的必须条件
- 本章摘要
- 第二章:安装、使用Haxe和Neko
- 安装Haxe
- 使用Haxe安装程序
- 在Windows上手动安装Haxe
- Linux上手动安装Haxe
- 安装Neko
- Windows上手动安装Neko
- 在Linux上安装Neko
- Hello world! 一式三份
- 编译你的第一个Haxe应用
- 你的程序如何编译
- HXML编译文件
- 编译到Neko
- 编译为JavaScript
- 程序结构
- 编译工具开关
- 本章摘要
- 第三章:基础知识学习
- Haxe层级结构
- 标准数据类型
- 变量
- 类型推断
- 常数变量
- 简单的值类型
- 浮点类型
- 整型
- 选择数值类型
- 布尔类型
- 字符串类型
- 抽象类型
- Void 和 Null
- 动态类型
- unknown类型
- 使用untyped绕过静态类型
- 注释代码
- 转换数据类型
- Haxe数组
- Array
- List
- Map
- Haxe中使用日期时间
- 创建一个时间对象
- Date组件
- DateTools类
- 操作数据
- 操作符
- Math类
- 使用String函数
- 本章摘要
- 第四章:信息流控制
- 数据存放之外
- 条件语句
- if语句
- switch语句
- 从条件语句返回值
- 循环
- while循环
- for循环
- 循环集合
- Break和Continue
- 函数
- 类的函数
- 局部函数
- Lambda类
- 本章摘要
- 第五章:深入面向对象编程
- 类和对象
- 实例字段
- 静态字段
- 理解继承
- Super
- 函数重载
- 构造器重载
- toString()
- 抽象类和抽象方法
- 静态字段,实例变量和继承
- 继承规则
- 使用接口
- 高级类和对象特性
- 类的实现
- 类型参数
- 匿名对象
- 实现动态
- Typedef
- 扩展
- 枚举
- 构造器参数
- 本章摘要
- 第六章:组织你的代码
- 编写可重用代码
- 使用包
- 声明一个包
- 隐式导入
- 显式导入
- 枚举和包
- 类型查找顺序
- 导入一个完整的包
- 导入库
- Haxe标准库
- Haxelib库
- 其他项目中的库
- 外部库
- 使用资源
- 文档化代码
- 离线文档
- 在线文档
- 单元测试
- haxe.unit包
- 编写测试
- 本章摘要
- 第七章:错误调试
- trace函数
- trace输出
- haxe的trace和ActionScript的trace
- 异常
- 异常处理
- CallStack和ExceptionStack
- 异常管理类
- 创建完全的异常处理类
- 异常类代码
- 本章摘要
- 第八章:跨平台工具
- XML
- XML剖析
- Haxe XML API
- 正则表达式
- EReg类
- 模式
- 定时器
- 延迟动作
- 队列动作
- MD5
- 本章摘要
- 第九章:使用Haxe构建网站
- Web开发介绍
- Web 服务器
- 使用Web服务器发布内容
- HTML速成课程
- Haxe和HTML的区别
- NekoTools Web Server
- Apache安装mod_neko
- Windows安装Apache和mod_neko
- Linux安装Apache和Mod_Neko
- 第一个Haxe网站
- 使用Neko作为网页Controller
- neko.Web类
- Neko作为前端控制器
- 本章摘要
- 第十章:使用模板进行分离式设计
- 什么是模板
- Template类
- Template语法
- 使用资产
- 何时在模板中使用代码
- 服务器端模板的Templo
- 安装Templo
- 使用Templo
- haxe.Template和mtwin.Templo表达式上的区别
- Attr表达式
- Raw表达式
- 逻辑表达式
- 循环表达式
- set, fill, 和 use表达式
- Templo中使用宏
- 手动编译模版
- 第十一章:执行服务端技巧
- 第十二章:使用Flash构建交互内容
- 第十三章:使用IDE
- 第十四章:通过JavaScript制作更多交互内容
- 第十五章:通过Haxe远程通信连接所学
- 第十六章:Haxe高级话题
- 第十七章:Neko开发桌面应用
- 第十八章:用SWHX开发桌面Flash
- 第十九章:多媒体和Neko
- 第二十章:使用C/C++扩展Haxe
- 附加部分