2013-05-18 71 views
0

首先,我想對我的語法道歉,因爲英語不是我的第一語言,通常我做語法錯誤......面向對象和Java:如何從抽象類推廣?

有一些問題一直阻止我做通用代碼:

如何將抽象類與抽象方法放在另一個抽象類中?我知道抽象類不能實例化,但是......沒有辦法用通用性來做到這一點嗎?

一個例子:我有抽象類貓科動物,這個類有幾個抽象方法。還有另外一類:Cage類,它只能包含一定數量的一種貓科動物物體(比如一隻貓的籠子,一隻虎皮鸚鵡,一隻獅子籠等)......但是,我是否這樣做?我不能實例化Felines裏面的籠子裏類...我怎麼做一隻貓的籠子?

另一個例子,我注意到我可以使用只有兩個排序標準來排序一個東西的集合:這東西是否追趕這另一個東西?和:這個東西在這之前是另一個東西嗎?因此,每個可排序的東西都必須有兩個布爾方法:「goesAfter(stuff):boolean」和「goesBefore(stuff):boolean」,然後,我通過組合/聚合關係將這些東西放到另一個類中,讓我們把它稱爲LotsOfSortableStuff類,並且我會把「sort():void」方法,這個方法將使用從這個可排序的東西的goAfter和goesBefore方法...

有很多事情可以排序:學生(按學位),孩子(按身高),姓名(按照排序)等等......問題是:每當我想要製作一個可排序的東西的集合時,我必須重複輸入相同的兩種方法,和分類algorythm!

如何在這類問題中應用通用性?

回答

2

多態性允許你存儲在被定義爲持有對象的容器一個的對象。例如,在你的類Cage你可以有一個List<Feline> felines可以包含一個子類的Feline

排序的任何對象:對於這個,你可以讓你的實現Comparator接口,這需要具體的子類實施compareTo方法。例如,如果你想按照貓的重量對Cage進行分類。

下面是什麼,可能看起來像一個例子:

import java.util.List; 
    import java.util.ArrayList; 
    import java.util.Collections; 

    public abstract class Feline implements Comparable 
    { 
     protected double weight; 

     protected abstract void whoAmI(); 

     public void compareTo(Feline other){ 
      new Double(this.weight).compareTo(new Double(other.weight)); 
     } 

     public static void main(String[] args){ 
      Cage c = new Cage(); 

      Feline l = new Lion(400.0); 
      Feline t = new Tiger(555.0); 

      c.addFeline(l); 
      c.addFeline(t); 

      for(Feline f : c.getCage()){ 
      f.whoAmI(); 
      } 
     } 
    } 

    class Tiger extends Feline 
    { 
     public Tiger(double weight){ 
      super(weight); 
     }  

     protected void whoAmI() { 
      System.out.println("I'm a Tiger"); 
     } 
    } 

    class Lion extends Feline 
    { 
     public Lion(double weight){ 
      super(weight); 
     } 

     protected void whoAmI() { 
      System.out.println("I'm a Lion"); 
     } 
    } 

    class Cage 
    { 
     private List<Feline> felines; 

     public Cage(){ 
      this.felines = new ArrayList<>(); 
     } 

     public void addFeline(Feline f){ 
      this.felines.add(f); 
     } 

     public List<Feline> getCage(){ 
      return this.felines; 
     } 

     public void sort(){ 
      Collections.sort(this.felines); 
     } 
    } 
+0

的感謝!它幫了很多......但是,** List **班怎麼樣才能存儲** Felines **? – Bengalaa

+0

@RuthGarcía定義的'List'接口是Java已經被設置來處理* generics *。通過這種方式,Java程序員可以創建任何類型的List,甚至可以創建自己創建的List。 –

+0

就像一個說明,你的'Feline'聲明應該是'公共抽象類Feline implements Comparable ' – cmbaxter

0

對於你的排序問題,你應該考慮讓你的所有類都需要在列表中進行聚合,然後對接口進行排序並實現Comparable接口。這是自定義對象排序的標準,並且Comparable列表項可以用Collections.sort排序,這非常簡單。