2013-02-23 77 views
2

我讀了很多關於「接口」和「抽象類」的文章在面向對象的編程中,我們需要抽象嗎?

基本上,我們在談論對象的特性時使用「抽象類」。

而我們使用「接口」,當我們調查什麼對象能夠做。

但它仍然讓我感到困惑,所以我爲自己做了一個練習的例子。

所以現在我想到一個對象的貨物;

public abstract class cargo { 

     protected int id; 

     public abstract int getWidth(int width); 

     public abstract int setWidth(int width); 

     public abstract int setHeight(int h); 

     public abstract int getHeight(int h); 

     public abstract int setDepth(int d); 

     public abstract int getDepth(int d); 

     public abstract int volume(int w,int h,int d); 

     public int getId(){ 
      return this.id; 
     } 

     public abstract int setId(); 

     public abstract void setBrand(); 

     public abstract void getBrand(); 

     .....so on , still have a lot of characteristic of a cargo 
    } 

    //in the other class 
    public class usaCargo extends cargo{ 
        .... 
        private 

    } 

因此,這裏有幾個關於我的設計的問題。

1.因此,在真正的編程項目世界中,我們是否真的像上面這樣做?對我來說,我認爲沒關係設計,我們符合貨物的基本特徵。

  1. 如果我們設置「專用標識」,那麼,我們卻不能因爲它是私人使用「身份證」在任何子類這個變量,所以是意味着我們在抽象類定義的每個變量必須是公共/保護?

  2. 有人可以舉一些合適的例子,讓我的貨物可以實現一些界面嗎?

    public interface registration{ 
        public void lastWarrantyCheck(); 
    } 
    

    ,但似乎不太適合在這裏...

  3. 我們不經常內部接口定義變量,請我們?

我試着在OOP上獲得更多的意義。原諒我很長的問題。

回答

1

你會在抽象類定義變量,這樣的抽象類定義的方法有變量使用。這些變量的範圍取決於您希望具體類如何訪問這些變量:

private當您要強制某個具體類通過抽象類中定義的getter或setter時,應該使用這些變量。當你想給變量的具體類直接訪問

protected應該被使用。

public當您希望變量可以被任何類訪問時,應該使用它。

貨物對象可能實施的合理界面可以設置爲如何將貨物從源移動到目的地。有些貨物可能通過貨運列車運輸,有些可能可以通過飛機運輸等等。實施可發貨的具體類別,以及如何確定這種類型的貨物將被運輸。

public interface Shippable { 
    public void ship(); 
} 

最後,接口中定義的變量必須是公共靜態的,最終意味着它是一個常量變量。

希望這能爲你解決它!

1
  1. 抽象類可以包含實現,所以他們可以有私有變量和方法。另一方面,接口不能。

  2. 你可以找到一些關於如何實現接口here的例子。不過,我包括了你將如何實現你的註冊示例如下。

    public class Cargo implements Registration{ 
        public void lastWarrantyCheck(){ 
         System.out.println("Last warranty check"); 
        }   
    } 
    
  3. 接口變量是可能的,但他們應該只包括常量聲明(被聲明爲static和final的變量聲明)。有關詳情,請參閱here

1
  1. 變量在抽象類中可以聲明爲protected,他們只會在它和任何擴展類可用。 Private變量在擴展類中永遠不可訪問。

  2. 接口提供了實現它們的類所需的函數列表。例如,您可以使用接口hasWarranty來定義對象處理保修相關活動所需的所有功能。

    public interface hasWarranty { 
        public void lastWarrantyCheck(); 
        public void checkWarranty(); 
    } 
    

    然後,需要執行質保相關活動的任何對象應實現該接口:

    // Disclaimer: been away from Java for a long time, so please interpret as pseudo-code. 
    
    // Will compile 
    public class Car implements hasWarranty { 
        public void lastWarrantyCheck() { 
         ... need to have this exact function or program won't compile ... 
        } 
        public void checkWarranty() { 
         ... need to have this exact function or program won't compile ... 
        } 
    } 
    
    // Missing one of the required functions defined in hasWarranty 
    public class Bus implements hasWarranty { 
        public void lastWarrantyCheck() { 
         ... need to have this exact function or program won't compile ... 
        } 
    } 
    
  3. 只有常量,真的像在接口中聲明的變量是不變的,是由所有共享實現該接口的對象。它們隱含地是「靜態最終」。