2012年8月4日 星期六

[問題] inheritance and abstract class

老師請問一下:
1. 父類別變數存取子類別物件的成員目的為何?
2. abstract method 問題
public class Abstruct
{
   public static void main(String args[])
   {
      CRetangle obj1 = new CRetangle(5,10);
      obj1.setcolor("Blue");
      obj1.show();
      
      CCircle obj2 = new CCircle(2.0);
      obj2.setcolor("Red");
      obj2.show();
   }
}
abstract class CShap
{
   protected String color;
   
   public void setcolor(String str)
   {
      color = str;
   }
   public abstract void show();    ===================================================>此指令不寫還是可以正常執行,那為何還要宣告此abstract method 
}
class CRetangle extends CShap
{
   protected int width,height;
   
   public CRetangle(int w,int h)
   {
      width = w;
      height = h;
   }
   public void show()
   {
      System.out.println("color = " + color);
      System.out.println("area = " + (width * height));
   }
}
class CCircle extends CShap
{
   protected double r;
   
   public CCircle(double rad)
   {
      r = rad;
   }
   public void show()
   {
      System.out.println("color = " + color);
      System.out.println("area = " + (3.14*r*r));
   }
}

A:
父類別變數存取子類別物件的成員???
可能是你會錯意了,父類別不可能知道子類別有什麼成員的.

至於抽象方法的用意,這個說來話長.
首先要知道override及多型的用意.
從你上面的程式只看到override但看不到多型.

把CRetangle obj1 = new CRetangle(5,10);
改成CShap obj1 = new CRetangle(5,10);
把CCircle obj2 = new CCircle(2.0);
改成CShap obj2 = new CCircle(2.0);
就知道 public abstract void show(); 省略有沒有一樣了

抽象類別(父類別)定義抽象方法,
主要是讓子類別來override這個抽象方法,
也就是說,不管多少個子類別來繼承這個抽象類別,
都一定有show()方法.
換句話說,抽象類別寫的抽象方法,是在定義一個規範出來,
其下的子類別一定依這個規範來做(override).
介面也是一樣的道理.

如同執行緒中的implements Runnable介面是一樣的意思,
一定要override run()方法才行.

沒有留言:

張貼留言