国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

產生正確的行為

2019-11-18 13:21:40
字體:
來源:轉載
供稿:網友


  知道java里綁定的所有方法都通過后期綁定具有多形性以后,就可以相應地編寫自己的代碼,令其與基礎類溝通。此時,所有的衍生類都保證能用相同的代碼正常地工作?;蛘邠Q用另一種方法,我們可以“將一條消息發給一個對象,讓對象自行判定要做什么事情。”
  
  在面向對象的程序設計中,有一個經典的“外形”例子。由于它很輕易用可視化的形式表現出來,所以經常都用它說明問題。但很不幸的是,它可能誤導初學者認為OOP只是為圖形化編程設計的,這種熟悉當然是錯誤的。
  
  外形例子有一個基礎類,名為Shape;另外還有大量衍生類型:Circle(圓形),Square(方形),Triangle(三角形)等等。大家之所以喜歡這個例子,因為很輕易理解“圓屬于外形的一種類型”等概念。下面這幅繼續圖向我們展示了它們的關系:
  
產生正確的行為

  上溯造型可用下面這個語句簡單地表現出來:
  
  Shape s = new Circle();
  
  在這里,我們創建了Circle對象,并將結果句柄立即賦給一個Shape。這表面看起來似乎屬于錯誤操作(將一種類型分配給另一個),但實際是完全可行的——因為按照繼續關系,Circle屬于Shape的一種。因此編譯器認可上述語句,不會向我們提示一條出錯消息。
  
  當我們調用其中一個基礎類方法時(已在衍生類里覆蓋):
  
  s.draw();
  
  同樣地,大家也許認為會調用Shape的draw(),因為這究竟是一個Shape句柄。那么編譯器怎樣才能知道該做其他任何事情呢?但此時實際調用的是Circle.draw(),因為后期綁定已經介入(多形性)。
  
  下面這個例子從一個稍微不同的角度說明了問題:
  
  //: Shapes.java
  // Polymorphism in Java
  
  class Shape {
   void draw() {}
   void erase() {}
  }
  
  class Circle extends Shape {
   void draw() {
  System.out.   }
   void erase() {
  System.out.println("Circle.erase()");
   }
  }
  
  class Square extends Shape {
   void draw() {
  System.out.println("Square.draw()");
   }
   void erase() {
  System.out.println("Square.erase()");
   }
  }
  
  class Triangle extends Shape {
   void draw() {
  System.out.println("Triangle.draw()");
   }
   void erase() {
  System.out.println("Triangle.erase()");
   }
  }
  
  public class Shapes {
   public static Shape randShape() {
  switch((int)(Math.random() * 3)) {
   default: // To quiet the compiler
   case 0: return new Circle();
   case 1: return new Square();
   case 2: return new Triangle();
  }
   }
   public static void main(String[] args) {
  Shape[] s = new Shape[9];
  // Fill up the array with shapes:
  for(int i = 0; i < s.length; i++)
   s[i] = randShape();
  // Make polymorphic method calls:
  for(int i = 0; i < s.length; i++)
   s[i].draw();
   }
  } ///:~
  
  針對從Shape衍生出來的所有東西,Shape建立了一個通用接口——也就是說,所有(幾何)外形都可以描繪和刪除。衍生類覆蓋了這些定義,為每種非凡類型的幾何外形都提供了獨一無二的行為。
  
  在主類Shapes里,包含了一個static方法,名為randShape()。它的作用是在每次調用它時為某個隨機選擇的Shape對象生成一個句柄。請注重上溯造型是在每個return語句里發生的。這個語句取得指向一個Circle,Square或者Triangle的句柄,并將其作為返回類型Shape發給方法。所以無論什么時候調用這個方法,就絕對沒機會了解它的具體類型到底是什么,因為肯定會獲得一個單純的Shape句柄。
  
  main()包含了Shape句柄的一個數組,其中的數據通過對randShape()的調用填入。在這個時候,我們知道自己擁有Shape,但不知除此之外任何具體的情況(編譯器同樣不知)。然而,當我們在這個數組里步進,并為每個元素調用draw()的時候,與各類型有關的正確行為會魔術般地發生,就象下面這個輸出示例展示的那樣:
  
  Circle.draw()
  Triangle.draw()
  Circle.draw()
  Circle.draw()
  Circle.draw()
  Square.draw()
  Triangle.draw()
  Square.draw()
  Square.draw()
  
  當然,由于幾何外形是每次隨機選擇的,所以每次運行都可能有不同的結果。之所以要突出外形的隨機選擇,是為了讓大家深刻體會這一點:為了在編譯的時候發出正確的調用,編譯器毋需獲得任何非凡的情報。對draw()的所有調用都是通過動態綁定進行的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 徐州市| 宜州市| 攀枝花市| 胶南市| 扶风县| 雅江县| 七台河市| 屏东市| 武鸣县| 班戈县| 吉木乃县| 宁城县| 平湖市| 淮安市| 黑河市| 三明市| 沅江市| 芦溪县| 布尔津县| 宁海县| 库车县| 都兰县| 安陆市| 原平市| 远安县| 金川县| 平利县| 聊城市| 江油市| 屯昌县| 许昌县| 神农架林区| 利津县| 湖州市| 德钦县| 冕宁县| 冕宁县| 丰都县| 望谟县| 永福县| 定安县|