2014-03-03 71 views
1

我明白這裏發佈Different return types of abstract method in java without castingC#抽象方法與返回不同類型的

的解決方案,但,我不認爲我可以使用泛型,因爲一些其他類包含的「內容」孩子,我不不想在編譯時決定使用哪種類型的內容。

public abstract class Content { 
    public abstract Content getContent(); 
} 

public class UrlContent : Content { 
    public String s; 
    public getContent(){ return s;} 

} 

public class ImageContent : Content { 
    public Byte[] image; 
    public getContent(){ return image;} 
} 
+0

你問你是否可以避免使用泛型?我不清楚你的問題是什麼。 – Metalskin

+1

我也不確定,但是ps.s.w.g的解決方案已經解決了我的問題。 –

回答

3

你可以做到這一點使用generics,並仍然認爲你可以參考任何你不需要知道的返回類型,例如,非通用接口:

public interface IContent { 
    object GetContent(); 
} 

public abstract class Content<T> : IContent { 
    public abstract T GetContent(); 
    object IContent.GetContent() 
    { 
     return this.GetContent(); // Calls the generic GetContent method. 
    } 
} 

public class UrlContent : Content<String> { 
    public String s; 
    public override String GetContent() { return s; } 
} 

public class ImageContent : Content<Byte[]> { 
    public Byte[] image; 
    public override Byte[] GetContent(){ return image; } 
} 
+0

但是現在每次我聲明一個新的內容時,都需要輸入。 –

+1

@ user3373235不,您可以聲明「IContent」類型的變量,它不是通用的。 –

1

假設以後的實現應該是public override Content getContent()方法...

你已經聲明你的函數返回一個Content對象,然後嘗試從它返回String或Byte []。這不起作用。如果您希望能夠返回任意數量的類型,最簡單的方法是返回Object而不是Content,這對byte []或字符串可以正常工作。它也可以作爲調用代碼的警告,表明數據類型可能幾乎任何東西。

您也可以使用類似於您在該鏈接中引用的泛型,並將不返回特定類型的類自定義爲public class StrangeContent : Content<object>,以便它們可以返回多個數據類型,而不會強制所有實現進行寬鬆輸入。

相關問題