2.5. 创建子类
问题
我要创建派生类
解决办法
使用extends关键字继承已有的类
讨论
如果新建的类和已有的类拥有公共特性但是又比已有类有更多细节,这时去重写所有的代码还不如从已有类中继承公共特性再添加专有代码。这时这个新类就是已有类的一个子类。
使用extends关键继承超类:
public class Subclass extends Superclass
子类可以引用任何超类中的 public 或 protected 的属性和方法,private 属性和方法是不能够访问的。
继承性是非常强大的功能,但是另一方面如何正确的使用继承也很重要。在写子类之前你要确定新类和超类是否已经有子类关系,这里有两种基本关系类型:继承和组合。你经常要确定类之间是"is a" 关系还是"has a" 关系:
"Is a" 关系是继承关系。如一个应用程序管理着一个图书馆的藏书。
"Has a" 关系是组合关系。大多数类使用组合,而且比继承更有伸缩性(然而需要更多代码)。例如一本书不是一个作者,但是它有一个作者。
图书馆有不同类型的藏品包括书和DVDs。很明显书和DVDs有不同的类型数据。书包括页数和作者,而DVDs则有播放时间数,演员,导演等等,但是也有一些公共数据,比如所有图书馆都有用一些唯一的数字编号或命名规则来管理这些藏品. 而且每个种类都有标题或名称,这时你可以定义个类来归纳这些公共信息:
public class LibraryItem ...{
protected var _ddc:String;
protected var _id:String;
protected var _name:String;
public function LibraryItem( ) ...{}
public function setDdc(value:String):void ...{
_ddc = value;
}
public function getDdc( ):String ...{
return _ddc;
}
public function setId(value:String):void ...{
_id = value;
}
public function getId( ):String ...{
return _id;
}
public function setName(value:String):void ...{
_name = value;
}
public function getName( ):String ...{
return _name;
}
}
}
书和DVDs 都是LibraryItem的一个种类. 接下来很自然就是定义Book 类和 DVD 类,继承自 LibraryItem,Book 类类似于:
import org.examplelibrary.collection.LibraryItem;
public class Book extends LibraryItem ...{
private var _authors:Array;
private var _pageCount:uint;
public function Book( ) ...{}
public function setAuthors(value:Array):void ...{
_authors = value;
}
public function getAuthors( ):Array ...{
return _authors;
}
public function setPageCount(value:uint):void ...{
_pageCount = value;
}
public function getPageCount( ):uint ...{
return _pageCount;
}
}
}
默认下可以继承任何类,但是如果你不要这个类再被继承,可以添加final修饰符申明该类:
final public class Example
没有评论:
发表评论