2012-05-28 18 views
1

我有一個java程序使用數組列表 - 這些數組列表存儲'變量'其中'變量'是一個抽象類。如何將抽象類轉換爲接口?

現在,爲了節省內存,我想使用名爲HugeCollections-VanillaJava的java庫,但是這個庫需要定義一個接口。

如何將抽象類轉換爲接口?我必須遵循哪些規則/限制才能正確執行轉換?

最後,是否可以使用我的抽象類進行最少的代碼更改,以便需要接口的庫也能正常工作?理想情況下,我想不要改變抽象類...這可能嗎?

+2

你能告訴我們一些你的代碼嗎?你的問題有點混亂。 – Jeremy

回答

5

如何將抽象類轉換爲接口?

  1. 讓抽象類的源文件的副本。

  2. 在初始聲明中將「class」更改爲「interface」。

  3. 更改名稱(可選,取決於你在做什麼)。

  4. 刪除由該類實現的任何方法的主體。

  5. 將「abstract」一詞從其他字詞中刪除。

  6. 刪除所有私人和受保護的會員。

  7. 刪除所有構造函數。

  8. 從公衆成員中刪除關鍵字「public」。

如果你有任何你刪除的代碼(實現方法,私有或受保護的東西),讓你的原始抽象類實現你的接口並在那裏留下那些東西。

(不完全)例:

Foo作爲一個抽象類:

public abstact class Foo 
{ 
    private int bar; 

    public static final int SOME_CONSTANT = 42; 

    public Foo(b) { 
     this.bar = b; 
    } 

    public abstract void doSomething(String s); 

    protected int doSomethingElse() { 
     return this.bar * 2; 
    } 
} 

Foo作爲一個接口:

public interface Foo 
{ 
    int SOME_CONSTANT = 42; 

    void doSomething(String s); 
} 

就我而言,我確實有一些東西老Foo沒有,我可能有AbstractFoo什麼的:

...這樣一個實現可以使用它作爲一個起點,如果需要的話(雖然那個privatebar在那裏,它沒有多大意義)。

+0

@JBNizet:謝謝!完成。 –

1

如果抽象類沒有定義任何具體方法,甚至可以使用正則表達式。來源:

public abstract class Abstract { 
    public abstract void method(); 
    //... 
} 

到:

public interface Interface { 
    void method(); 
    //... 
} 

public abstract修飾符是隱含的接口。如果類別確實定義了一些方法(並非所有的方法都是abstract)或者有一些字段不能完成(至少很容易)。

+0

不要忘記抽象類中的屬性 –

+0

@LuiggiMendoza:謝謝,添加到我的回答 –

2

模式Adapter可能會幫助你。

想象一下,你必須使用SomeClass的TargetInterface

public abstract class SomeClass { 
     // some code here 
    public abstract void someMethod(); 
} 

public interface TargetInterface { 
    public void someMethodBlaBla(); 
} 

而且他們的方法不同的簽名 - )的someMethod(someMethodBlaBla()

所以你可以創建這樣的適配器類:

public class Adapter implements TargetInterface { 
    private SomeClass adaptee; 

    public Adapter(SomeClass adaptee) { 
     this.adaptee = adaptee; 
    } 

    public void someMethodBlaBla() { 
     this.adaptee.someMethod(); 
    } 

    //delegate all calls to adaptee 
} 

並在代碼的某個地方,你可以同時使用 - 在當前的代碼適配器和抽象類的實例,無干擾:

SomeClass abstractClassInstance = ... //get instance of your abstract class 
TargetInterface targetInterfaceInstance = new Adapter(abstractClassInstance);