A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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();                                                                                                                                                        马虎不得                                                                                                         
                                                                                                                                回答采纳率:26.5%                                2010-03-24 09:00                                                                                                    [url=]好:0[/url]                       [url=]不好:0[/url]                                                                                                                                            
                       
                                                                LZ确定void area()方法的放回类型确实是void?

public interface IShape{
           void area();//计算面积
            void setData(Double data...);//设置半径或者长宽
            Double getArea();//获得面积
}

public class Circle implements IShape{
          private final double PAI = 3.14;
          private double r;
          private double area;

          public Circle(){}

         public void area(){//计算圆面积
                    area = PAI * r *r;
          }

           public void setData(Double data...){//设置半径
                          if(data != null && data.length > 0){
                                  r = data[0];
                          }
            }

            public Double getArea(){//获得面积
                        return area;
            }
}



public class Rect implements IShape{
          private double l;//长
          private double w;//宽
          private double area;//面积

          public Rect (){}

          public void area(){//计算矩形面积
                    area = l * w;
          }

           public void setData(Double data...){//设置半径
                          if(data != null){
                                 if(data.length == 1){//正方形
                                         l = data[0];
                                          w = data[0];
                                 }else if(data.length > 1){
                                         l = data[0];
                                          w = data[1];
                                 }
                          }
            }

            public Double getArea(){//获得面积
                        return area;
            }
}

//测试

public static void main(String[] args){
            IShape circle = new Circle();
            circle.setData(1.2);
            circle.area();

           IShape rect= new Rect();
            rect.setData(1.3,1.2);
            rect.area();

           if(circle.getArea() > rect.getArea()){
                        System.out.println("圆的面积大");
           }else if(circle.getArea() < rect.getArea(){
                        System.out.println("矩形的面积大");
           }else{
                          System.out.println("面积一样大");
           }
}
       

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马