2011-01-20 48 views
1

我正在尋求在包私有java類上實現接口,但我在實現上遇到了一些困難。下面是一個例子。如何在受保護的java類上實現接口

class Foo 
{ 
    String something(String str) 
    { 
     return ""str+"!"; 
    } 
} 




public interface Bar 
{ 
    String something(String str); 
} 

這裏最好的辦法是什麼?我的最終目標是在Foo類上實現Bar接口。我希望能夠將Foo當成Bar:(Bar)Foo

Bar接口和Foo類在單獨的包中。有沒有辦法做到這一點?

請指教。

回答

2

你不能。讓包級別訪問它的目的是爲了避免在外面看到這個類。然而,你可以做什麼(授予Foo不是最終的)如下所示:

C:\>type *.java 
//Foo.java 
package foo; 
class Foo { 
    String something(String s) { 
    return s + "!"; 
    } 
} 
//Bar.java 
package bar; 
public interface Bar { 
    public String something(String s); 
}  
//Baz.java 
package foo;  
import bar.Bar;  
public class Baz extends Foo implements Bar { 
    // make sure you're overriding 
    @Override 
    public String something (String s) { 
    return super.something(s); 
    } 
}  
//Use it: Main.java 
package bar; 
import foo.Baz; 
class Main { 
    public static void main(String ... args) { 
    Bar bar = new Baz(); 
    System.out.println(bar.something("like this?")); 
    } 
} 

C:\>java bar.Main 
like this?! 

Da da!

訣竅是定義與父項相同的包中的子項,以便您可以創建它的公共版本。

我希望這會有所幫助。

1

美孚需要實施酒吧

protected class Foo implements Bar

另外,我覺得Foo.something需要是爲了實現Bar.something

旁註公共:雖然這可能只是作爲例如,

return ""str+"!";

應該是:

return str + "!";

如果foo是包私有的,你沒有訪問源,只是類文件和/或包含讓Foo.class的罐子,有沒有太多做 - 私有包的東西在默認包(沒有指定包)和其他包的類中是不可見的。

+1

Foo.something不公開,我沒有訪問 – andersra 2011-01-20 01:59:50

+0

你知道嗎如果Foo。有些東西至少受到保護?根據你的例子,Foo.something是包裝可見的,我不知道我們能做多少。 – 2011-01-20 02:00:59

+0

@andersra:你說「我沒有訪問權限」是什麼意思? – OscarRyz 2011-01-20 02:13:11

2

當你對某個班級沒有控制權但你想讓它看起來像一個你擁有的API時,那麼你Adapt它適合你的需求。提示:適配器模式

1

如果您無法訪問Foo的源代碼,則需要使用繼承或組合。

// By logically including your code in the package containing Foo, 
// you can now access it. If Foo belongs to the default package, sorry. 
// This also doesn't work if the package is sealed. 
package where.foo.resides; 

public interface Bar { 
    String something(String s); 
} 

// Inheritance 
public class FooBar extends Foo implements Bar { 
    public String something(String s) { 
     return super.something(s); 
    } 
} 

// Composition 
public class ComposedFooBar implements Bar { 
    private final Foo delegate; 
    public ComposedFooBar(Foo delegate) { 
     this.delegate = delegate; 
    } 
    public String something(String s) { 
     return delegate.something(s); 
    } 
} 
0

您可以嘗試在BCEL或ASM中使用字節碼注入並在運行時設置接口。雖然這很棘手。

也可能有一種方法來改變與反射的交互,但我懷疑它。

私人是有原因的。