zoukankan      html  css  js  c++  java
  • 新人补钙系列教程之:类,接口,多态,工厂方法

    实现结果:用户可以输入几何形状(circle,triangle,square)和形状在小(边的长度sideLength),程序自动得出关于该几何形的相关信息(是什么形,面积,周长,角度和)

    首先想到为3个形状做3个类,每个类里都有describe()这个方法,用来输出此形状的相关信息。然后再弄一个类,用来判定是用户输入的是哪个形状,创建几何形的实例对象。

    用接口去实现。把共同都要执行的方法(尽管执行的内容不同),写在一个接口里。这样就可以利用“多态”来实”完全相同的方法调用会导致执行不同的代码,这取决于要调用了其方法的对象的类。”
    1.创建一个Ishape类(定义了两个共同的方法:获取面积,描述信息)

    1. package{
    2. public interface Ishape{
    3.   function getArea():Number;      //这里只声明方法,只是一个“孔”而已
    4.   function describe():String;
    5. }
    6. }
    复制代码

    我们还要知道每个形状的周边长度。但是,圆的周边长度叫做周长,它的计算方式是独有的,所以其行为异于三角形或正方形的行为。不过,三角形、正方形和其它多边形之间仍然有很多类似之处,所以为它们定义一个新接口类 IPolygon 还是很有意义的。先搞定circle类
    2.创建一个Circle接口类(这个类实现了接口,这样,就一定要写接口中定义的方法)

    1. package{
    2. public class Circle implements Ishape{     //implements 是实现接口的意思
    3.   private var diameter:int;
    4.   public function Circle(_diameter:int){
    5.    diameter = _diameter;  //传入半径
    6.   }
    7.   public function getArea():Number{   //返回面积
    8.    return Math.round(diameter*diameter*Math.PI);
    9.   }
    10.   public function getCircumference():Number{  //返回周长
    11.    return Math.round(2 * Math.PI * diameter);
    12.   }
    13.   public function describe():String{  .//返回圆的信息
    14.    var aa = "这是圆,";
    15.    aa+="面积为"+this.getArea()+",";
    16.    aa+="周长为"+this.getCircumference();
    17.    return aa;
    18.   }
    19. }
    20. }
    复制代码

    这个时候如果 var circle:Ishape = new Circle(10); trace(circle.describe())就会输出信息了。以前没有用接口是var circle:Circle= new Circle(10).这里接口也是一种数据类型。下面就知道这拿接口来做为数据类型(多态)的好处了

    3.创建一个IregularPolygon接口类(Ishape接口已经抽出形状最基本的方法了,还需把不属于圆形而属于三角形、正方形的方法出来定义接口,)

    1. package{
    2. public interface IregularPolygon extends Ishape{
    3.   function getperimeter():int;  //获取周长(也可以抽出到Ishape接口类中,因为想方法名不同,所以我就分开了)
    4.   function getsumofAngles():int;  //获取角度和
    5.    }
    6. }
    7. 4.创建一个RegularPolygon类(这个是基本多边形的父亲,实现IregularPolygon接口(共同的方法)就行了);
    8. [code]public class RegularPolygon implements IregularPolygon{
    9.   public var numSides:int; 
    10.    public var sideLength:int;
    11.   public function RegularPolygon(sideLength:int=10,numSide:int=0){
    12.           this.sideLength = sideLength; 
    13.             this.numSides = numSide; 
    14.   }
    15.   public function getArea():Number{
    16.    return 0;
    17.   }
    18.   public function getperimeter():int{
    19.    //获取周长
    20.    return sideLength * numSides; 
    21.   }
    22.   public function getsumofAngles():int{
    23.    //获得角度
    24.      if (numSides >= 3) 
    25.             { 
    26.                 return ((numSides - 2) * 180); 
    27.             } 
    28.             else 
    29.             { 
    30.                 return 0; 
    31.             } 
    32.   }
    33.   public function describe():String{   //描述信息
    34.    var desc:String = "Each side is " + sideLength + " pixels long.\n"; 
    35.             return desc; 
    36.   }
    37. }
    38. }
    复制代码

    [/code]
    5.创建Triangleo类继承RegularPolygon(因为RegularPolygon实现了接口,所以Triangle也实现了接口)

    1. package{
    2. public class Triangle extends RegularPolygon{
    3.   public function Triangle(sideLength:int){
    4.         super(sideLength,3);      //相当于执行了父亲的构造函数
    5.   }
    6.   public override function getArea():Number{    
    7.       return ( (this.sideLength * this.sideLength) * Math.sqrt(3) ) / 4; 
    8.   }
    9.   public override function describe():String{   //重写了方法
    10.     var desc:String = "This shape is an equilateral Triangle.\n"; 
    11.              desc += super.describe();    //访问父亲的describe
    12.             return desc; 
    13.   }
    14. }
    15. }
    复制代码

    6.创建 Square 类继承RegularPolygon。

    1. package{
    2. public class Square extends RegularPolygon{
    3.   public function Square(_sideLength:int){
    4.    super(_sideLength,4);
    5.   }
    6.   public override function getArea():Number{
    7.    return sideLength *sideLength;
    8.   }
    9.   public override function describe():String{
    10.    var aa ="这是正方形";
    11.    aa+=super.describe();
    12.    return aa;
    13.   }
    14. }
    15. }
    复制代码

    可以发现triangle和square的getArea,describe方法都不同,所以都要重写
    7.创建工厂方法( 指的是一个函数,该函数返回一个对象,其基本数据类型或内容可能会因上下文而不同。)

    1. package
    2. {
    3. public  class GeometricShapeFactory
    4. {
    5.   public static var currentShape:Ishape;
    6.   public static function createShape(shapeName:String,len:Number):Ishape 
    7.         { 
    8.             switch (shapeName) 
    9.             { 
    10.                 case "Triangle": 
    11.                     return new Triangle(len); 
    12.                 case "Square": 
    13.                     return new Square(len); 
    14.                 case "Circle": 
    15.                     return new Circle(len); 
    16.             } 
    17.             return null; 
    18.         } 
    19.   public static function describeShape(shapeType:String,shapeSize:int)
    20.   {
    21.    GeometricShapeFactory.currentShape = GeometricShapeFactory.createShape(shapeType, shapeSize); 
    22.             return GeometricShapeFactory.currentShape.describe();    //执行同样的方法,但返回却会是不同的结果
    23.   }
    24. }
    25. }
    复制代码

    总结:1.接口里放的就是共同的方法名,没有实质内容,实质内容如果是一样的。可以弄一个父亲,写这个一样的实质内容(就像上面的getperimeter,getsumofAngles)。这样,当儿子被创建实例化时,即使儿子那里没有写,但仍然可以访问,因为继承了。如果实质内容不同,每个儿子实现那个接口,各写各的。(就像上面的getArea,describe); 2.接口里抽出的方法,在实现时都要重写一次,尽管没有用到(可能子类会用到,就像RegularPolygon里的getArea())。  3.继承时,构造函数里的内容无法继承,所以要用 super重写一次,(就像上面的super(sideLength,3);参数个数要一样)。4. 访问父类的方法属性:super.describe();

  • 相关阅读:
    leetCode-Two Sum
    leetCode-Pascal's Triangle II
    leetCode-Maximum Average Subarray I
    css 实现垂直水平居中
    poping 心法
    我的机密
    MSMQ消息队列的使用
    生成最大单号 scope_identity
    sqlserver ADO.net 查询数据库加锁,事务提交
    漂亮的JS插件
  • 原文地址:https://www.cnblogs.com/keng333/p/2299771.html
Copyright © 2011-2022 走看看