2011年3月24日 星期四

漫談物件導向(十二) - 再談資料繼承

再談資料繼承

先前提到基於封裝性 (encapsulation)最好將資料成員 (屬性) 設定為private,而由成員方法管控資料成員的存取權。在介紹繼承時,也指出宣告為private之成員方法只有自身類別可以使用,那麼子類別會不會繼承父類別的private資料成員?

其實子類別內還是存在著來自父類別的private資料成員,只是不允許直接使用這些資料成員,除非父類別有提供方法來存取這些private資料成員。檢視下列程式碼中,BALL類別的radius資料成員是private性質,BASKETBALL類別繼承BALL類別,自然還是具備radius屬性,只是不能直接取用,因此程式碼第15行作法是不被允許的;但BASKETBALL類別仍可透過繼承自BALL類別的getRadius()方法來取得radius值 (如程式碼第16行)。從現實生活的角度來看,籃球既然繼承球類別,隱含具備半徑屬性是合理的。

1.    public class BALL {
2.        private float radius;
3.        public BALL (float r) {
4.            this.radius = r;
5.        }
6.        public float getRadius() {
7.            return radius;
8.        }
9.    }
10.  public class BASKETBALL extends BALL {
11.      BASKETBALL (float r) {
12.          super(r);
13.      }
14.      public void showinfo() {
15.          System.out.println(this.radius);           //錯誤
16.          System.out.println(this.getRadius()); //正確
17.      }
18.  }