新人补钙系列教程之:类,接口,多态,工厂方法
2011-12-23 17:23
453 查看
实现结果:用户可以输入几何形状(circle,triangle,square)和形状在小(边的长度sideLength),程序自动得出关于该几何形的相关信息(是什么形,面积,周长,角度和)
首先想到为3个形状做3个类,每个类里都有describe()这个方法,用来输出此形状的相关信息。然后再弄一个类,用来判定是用户输入的是哪个形状,创建几何形的实例对象。
用接口去实现。把共同都要执行的方法(尽管执行的内容不同),写在一个接口里。这样就可以利用“多态”来实”完全相同的方法调用会导致执行不同的代码,这取决于要调用了其方法的对象的类。”
1.创建一个Ishape类(定义了两个共同的方法:获取面积,描述信息)
package{
public interface Ishape{
function getArea():Number; //这里只声明方法,只是一个“孔”而已
function describe():String;
}
}
复制代码
我们还要知道每个形状的周边长度。但是,圆的周边长度叫做周长,它的计算方式是独有的,所以其行为异于三角形或正方形的行为。不过,三角形、正方形和其它多边形之间仍然有很多类似之处,所以为它们定义一个新接口类 IPolygon 还是很有意义的。先搞定circle类
2.创建一个Circle接口类(这个类实现了接口,这样,就一定要写接口中定义的方法)
package{
public class Circle implements Ishape{ //implements 是实现接口的意思
private var diameter:int;
public function Circle(_diameter:int){
diameter = _diameter; //传入半径
}
public function getArea():Number{ //返回面积
return Math.round(diameter*diameter*Math.PI);
}
public function getCircumference():Number{ //返回周长
return Math.round(2 * Math.PI * diameter);
}
public function describe():String{ .//返回圆的信息
var aa = "这是圆,";
aa+="面积为"+this.getArea()+",";
aa+="周长为"+this.getCircumference();
return aa;
}
}
}
复制代码
这个时候如果 var circle:Ishape = new Circle(10); trace(circle.describe())就会输出信息了。以前没有用接口是var circle:Circle= new Circle(10).这里接口也是一种数据类型。下面就知道这拿接口来做为数据类型(多态)的好处了
3.创建一个IregularPolygon接口类(Ishape接口已经抽出形状最基本的方法了,还需把不属于圆形而属于三角形、正方形的方法出来定义接口,)
package{
public interface IregularPolygon extends Ishape{
function getperimeter():int; //获取周长(也可以抽出到Ishape接口类中,因为想方法名不同,所以我就分开了)
function getsumofAngles():int; //获取角度和
}
}
4.创建一个RegularPolygon类(这个是基本多边形的父亲,实现IregularPolygon接口(共同的方法)就行了);
5.创建Triangleo类继承RegularPolygon(因为RegularPolygon实现了接口,所以Triangle也实现了接口)
package{
public class Triangle extends RegularPolygon{
public function Triangle(sideLength:int){
super(sideLength,3); //相当于执行了父亲的构造函数
}
public override function getArea():Number{
return ( (this.sideLength * this.sideLength) * Math.sqrt(3) ) / 4;
}
public override function describe():String{ //重写了方法
var desc:String = "This shape is an equilateral Triangle.\n";
desc += super.describe(); //访问父亲的describe
return desc;
}
}
}
复制代码
6.创建 Square 类继承RegularPolygon。
package{
public class Square extends RegularPolygon{
public function Square(_sideLength:int){
super(_sideLength,4);
}
public override function getArea():Number{
return sideLength *sideLength;
}
public override function describe():String{
var aa ="这是正方形";
aa+=super.describe();
return aa;
}
}
}
复制代码
可以发现triangle和square的getArea,describe方法都不同,所以都要重写
7.创建工厂方法( 指的是一个函数,该函数返回一个对象,其基本数据类型或内容可能会因上下文而不同。)
package
{
public class GeometricShapeFactory
{
public static var currentShape:Ishape;
public static function createShape(shapeName:String,len:Number):Ishape
{
switch (shapeName)
{
case "Triangle":
return new Triangle(len);
case "Square":
return new Square(len);
case "Circle":
return new Circle(len);
}
return null;
}
public static function describeShape(shapeType:String,shapeSize:int)
{
GeometricShapeFactory.currentShape = GeometricShapeFactory.createShape(shapeType, shapeSize);
return GeometricShapeFactory.currentShape.describe(); //执行同样的方法,但返回却会是不同的结果
}
}
}
复制代码
总结:1.接口里放的就是共同的方法名,没有实质内容,实质内容如果是一样的。可以弄一个父亲,写这个一样的实质内容(就像上面的getperimeter,getsumofAngles)。这样,当儿子被创建实例化时,即使儿子那里没有写,但仍然可以访问,因为继承了。如果实质内容不同,每个儿子实现那个接口,各写各的。(就像上面的getArea,describe); 2.接口里抽出的方法,在实现时都要重写一次,尽管没有用到(可能子类会用到,就像RegularPolygon里的getArea())。 3.继承时,构造函数里的内容无法继承,所以要用 super重写一次,(就像上面的super(sideLength,3);参数个数要一样)。4. 访问父类的方法属性:super.describe();
首先想到为3个形状做3个类,每个类里都有describe()这个方法,用来输出此形状的相关信息。然后再弄一个类,用来判定是用户输入的是哪个形状,创建几何形的实例对象。
用接口去实现。把共同都要执行的方法(尽管执行的内容不同),写在一个接口里。这样就可以利用“多态”来实”完全相同的方法调用会导致执行不同的代码,这取决于要调用了其方法的对象的类。”
1.创建一个Ishape类(定义了两个共同的方法:获取面积,描述信息)
package{
public interface Ishape{
function getArea():Number; //这里只声明方法,只是一个“孔”而已
function describe():String;
}
}
复制代码
我们还要知道每个形状的周边长度。但是,圆的周边长度叫做周长,它的计算方式是独有的,所以其行为异于三角形或正方形的行为。不过,三角形、正方形和其它多边形之间仍然有很多类似之处,所以为它们定义一个新接口类 IPolygon 还是很有意义的。先搞定circle类
2.创建一个Circle接口类(这个类实现了接口,这样,就一定要写接口中定义的方法)
package{
public class Circle implements Ishape{ //implements 是实现接口的意思
private var diameter:int;
public function Circle(_diameter:int){
diameter = _diameter; //传入半径
}
public function getArea():Number{ //返回面积
return Math.round(diameter*diameter*Math.PI);
}
public function getCircumference():Number{ //返回周长
return Math.round(2 * Math.PI * diameter);
}
public function describe():String{ .//返回圆的信息
var aa = "这是圆,";
aa+="面积为"+this.getArea()+",";
aa+="周长为"+this.getCircumference();
return aa;
}
}
}
复制代码
这个时候如果 var circle:Ishape = new Circle(10); trace(circle.describe())就会输出信息了。以前没有用接口是var circle:Circle= new Circle(10).这里接口也是一种数据类型。下面就知道这拿接口来做为数据类型(多态)的好处了
3.创建一个IregularPolygon接口类(Ishape接口已经抽出形状最基本的方法了,还需把不属于圆形而属于三角形、正方形的方法出来定义接口,)
package{
public interface IregularPolygon extends Ishape{
function getperimeter():int; //获取周长(也可以抽出到Ishape接口类中,因为想方法名不同,所以我就分开了)
function getsumofAngles():int; //获取角度和
}
}
4.创建一个RegularPolygon类(这个是基本多边形的父亲,实现IregularPolygon接口(共同的方法)就行了);
public class RegularPolygon implements IregularPolygon{ public var numSides:int; public var sideLength:int; public function RegularPolygon(sideLength:int=10,numSide:int=0){ this.sideLength = sideLength; this.numSides = numSide; } public function getArea():Number{ return 0; } public function getperimeter():int{ //获取周长 return sideLength * numSides; } public function getsumofAngles():int{ //获得角度 if (numSides >= 3) { return ((numSides - 2) * 180); } else { return 0; } } public function describe():String{ //描述信息 var desc:String = "Each side is " + sideLength + " pixels long.\n"; return desc; } } } 复制代码
5.创建Triangleo类继承RegularPolygon(因为RegularPolygon实现了接口,所以Triangle也实现了接口)
package{
public class Triangle extends RegularPolygon{
public function Triangle(sideLength:int){
super(sideLength,3); //相当于执行了父亲的构造函数
}
public override function getArea():Number{
return ( (this.sideLength * this.sideLength) * Math.sqrt(3) ) / 4;
}
public override function describe():String{ //重写了方法
var desc:String = "This shape is an equilateral Triangle.\n";
desc += super.describe(); //访问父亲的describe
return desc;
}
}
}
复制代码
6.创建 Square 类继承RegularPolygon。
package{
public class Square extends RegularPolygon{
public function Square(_sideLength:int){
super(_sideLength,4);
}
public override function getArea():Number{
return sideLength *sideLength;
}
public override function describe():String{
var aa ="这是正方形";
aa+=super.describe();
return aa;
}
}
}
复制代码
可以发现triangle和square的getArea,describe方法都不同,所以都要重写
7.创建工厂方法( 指的是一个函数,该函数返回一个对象,其基本数据类型或内容可能会因上下文而不同。)
package
{
public class GeometricShapeFactory
{
public static var currentShape:Ishape;
public static function createShape(shapeName:String,len:Number):Ishape
{
switch (shapeName)
{
case "Triangle":
return new Triangle(len);
case "Square":
return new Square(len);
case "Circle":
return new Circle(len);
}
return null;
}
public static function describeShape(shapeType:String,shapeSize:int)
{
GeometricShapeFactory.currentShape = GeometricShapeFactory.createShape(shapeType, shapeSize);
return GeometricShapeFactory.currentShape.describe(); //执行同样的方法,但返回却会是不同的结果
}
}
}
复制代码
总结:1.接口里放的就是共同的方法名,没有实质内容,实质内容如果是一样的。可以弄一个父亲,写这个一样的实质内容(就像上面的getperimeter,getsumofAngles)。这样,当儿子被创建实例化时,即使儿子那里没有写,但仍然可以访问,因为继承了。如果实质内容不同,每个儿子实现那个接口,各写各的。(就像上面的getArea,describe); 2.接口里抽出的方法,在实现时都要重写一次,尽管没有用到(可能子类会用到,就像RegularPolygon里的getArea())。 3.继承时,构造函数里的内容无法继承,所以要用 super重写一次,(就像上面的super(sideLength,3);参数个数要一样)。4. 访问父类的方法属性:super.describe();
相关文章推荐
- 新人补钙系列教程之:Function类的重要方法apply()
- 新人补钙系列教程之:XML处理方法
- 新人补钙系列教程之: ... (rest) 参数
- 新人补钙系列教程之:体验ApplicationDomain 应用程序域
- 新人补钙系列教程之:卡马克卷轴算法
- 关于类,接口,多态,工厂方法的实例
- 新人补钙系列教程之:模拟java多线程Thread类
- 新人补钙系列教程之:回调函数
- 新人补钙系列教程之: 搭建 PureMVC pipe
- 新人补钙系列教程之:3D理论 - 二进制空间分割(BSP)树
- 新人补钙系列教程之:Pipes Util 实现 Module 之间消息通信
- 新人补钙系列教程之:拒绝CPU高占用
- 新人补钙系列教程之: 大型 webGame 开发系列之 pipes
- 新人补钙系列教程之:Dictionary,关联数组
- 新人补钙系列教程之:图片与二进制或字符串相互转换
- 新人补钙系列教程之:AS3事件处理--事件流
- 新人补钙系列教程之:开发 webgame 的一点点经验
- 新人补钙系列教程之:网页游戏分线到不分线
- 新人补钙系列教程之:webgame好友模块原型开发一
- 新人补钙系列教程之:拒绝CPU高占用