💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
已经解释过,采用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 { } ~~~