2012-04-07 84 views
11

我正在開發一個SPI,並且希望定義一個Reportable接口,以便任何實現都必須覆蓋toString()以使其具有意義。Java:強制執行的設計接口覆蓋toString

有什麼辦法可以在Java中編寫一個接口,使其任何具體的實現必須覆蓋對象的toString()?例如:

public interface Reportable 
{ 
    public String toString(); 
} 

public class Widget implements Fizz, Buzz, Reportable 
{ 
    // ... 

    @Override 
    public String toString() 
    { 
     // ... 
    } 
} 

我知道上面的代碼不這種行爲,但是是什麼我要找的,即一個例子,如果Widget不會覆蓋toString()你得到一個編譯錯誤是因爲它違反了接口合同。

+0

對於抽象類:http://stackoverflow.com/questions/8719482/force-tostring-implementation-in-subclasses – 2015-03-02 12:54:43

+0

的[強制類重寫.equals方法]可能重複(HTTP:/ /stackoverflow.com/questions/1612273/force-a-class-to-override-the-equals-method)。任何方法都應該是一樣的。 – 2015-03-02 12:55:43

回答

16

不,你不能這樣做。我建議你選擇不同的方法名稱,例如

public interface Reportable 
{ 
    String createReport(); 
} 

這將迫使實現寫一個合適的方法。 toString()的意圖已經有些模糊 - 無論是用於調試表示還是用戶可見的表示(在這一點上,您需要問自己關於語言環境等)。添加另一個對我來說似乎不是一個好主意。

10

我的理解是,你想創建一個整齊地給他們的字符串表示的類的集合。所以當像System.out.println(yourobject)這樣的東西被調用時,它會顯示有意義的數據。

你不能強制你的子類重寫toString。但你可以做這樣的事情。

abstract class MyBase 
{ 
    abstract String getNiceString(); 
    @Override 
    public String toString() 
    { 
     return getNiceString(); 
    } 
} 
+0

巧妙,謝謝你的想法。 :) – Daren 2014-03-06 10:27:09

+1

輝煌!這應該是被接受的答案。 – SnakeDoc 2014-03-20 18:17:32