2014-10-17 49 views
0

我對抓取工具抽象類:如何讓抽象類更簡潔?

public abstract class AbstractCrawler { 
    public AbstractCrawler(){ 
     initialize(); 
    } 
    protected abstract void initialize(); 
    protected abstract void work(); 
    protected abstract void saveAndUpdate(Object obj); 
} 

正如你所看到的,「saveAndUpdate」抽象方法需要對象的帕拉姆,因爲,每個履帶擴展了這種抽象會保存或更新不同的數據類型,如這樣的:

public class UserCrawler extends AbstractCrawler{ 
    @Override 
    protected void saveAndUpdate(List<User> obj) { 
     // TODO Auto-generated method stub 

    } 
} 

和類CommentCrawler的:

public class CommentCrawler extends AbstractCrawler{ 
     @Override 
     protected void saveAndUpdate(List<Comment> obj) { 
      // TODO Auto-generated method stub 

     } 
} 

這是很明顯,只是像做this.Making抽象ç lass更簡潔。

+1

使用泛型'公共抽象類AbstractCrawle {'然後'保護抽象無效saveAndUpdate(T OBJ)'.... – MadProgrammer 2014-10-17 01:38:45

+0

[注意] (http://stackoverflow.com/questions/18138397/calling-method-from-constructor) – 2014-10-17 01:39:35

+0

@MadProgrammer但是其他程序員不知道T是什麼,他們只是想通過public method.how來使用類的功能使用Object並在「saveAndUpdate」的子類方法中執行converte。 – v11 2014-10-17 01:45:36

回答

4

你可以使用內置的泛型支持,例如...

public abstract class AbstractCrawler<T> { 
    public AbstractCrawler(){ 
     initialize(); 
    } 
    protected abstract void initialize(); 
    protected abstract void work(); 
    protected abstract void saveAndUpdate(T obj); 
} 

這允許實現指定數據的他們期待與之合作的類型......

public class CommentCrawler extends AbstractCrawler<List<Comment>> { 
    @Override 
    protected void saveAndUpdate(List<Comment> obj) { 
     //.... 
    } 

    //... 
} 

而且,請小心調用構造函數的方法,該方法可能依賴的方法可能尚未初始化。

看一看Lesson: Generics瞭解更多詳情...

+0

非常感謝你。 – v11 2014-10-17 01:50:57

+0

很高興幫助... – MadProgrammer 2014-10-17 02:07:05