[英]Java built-in class to interface
你能創建一個繼承java內置類所有功能的接口嗎?
我正在嘗試做的事情:
我有很多擴展 Fragment 的類,在這些類中有一些屬性(get、set)和一些函數。 在創建不同類的對象后,我將它們放在一個通用 Fragment 列表中。
但我想介紹多態:1 個接口類和所有其他類都實現了它,以便它們可以覆蓋函數。
但是問題是,如果我想使用多態,我需要一個接口,並且接口應該是一個 Fragment 這樣我仍然可以將這些 Fragment 放入一個列表中,那么我可以從 Fragment 類創建一個接口還是接口可以繼承從碎片?
在圖像上你可以看到當前的情況
這是一些代碼來顯示我想要實現的目標:
所以我的主函數是一個 xmlSAXParser,當我遇到一個標簽時,我創建了一個正確類的對象:
case template:
switch (typeObjecten.toType(atType)) {
case NOVALUE:
break;
case chapter:
chapter = new ChapterFragment();
typeObject = "chapter";
break;
case execute:
execute = new ExecuteFragment();
typeObject = "execute";
break;
case first:
first = new FirstFragment();
typeObject = "first";
break;
...
當我找到結束標簽時,我將正確的對象添加到列表中:
case template:
switch (typeObjecten.toType(typeObject)) {
case NOVALUE:
break;
case chapter:
fragments.add(ownFrag);
break;
case execute:
fragments.add(execute);
break;
case first:
fragments.add(first);
break;
case navigation:
fragments.add(navigation);
break;
case story:
fragments.add(story);
break;
....
也有可能在每個類中背景都可能發生變化,現在我必須檢查對象要調用哪個類來調用正確的函數:
case background:
if (typeObject.equalsIgnoreCase("navigation")) {
navigation.setBackgroundColor("#" + text);
} else if (typeObject.equalsIgnoreCase("chapter")) {
//chapter.setBackgroundColor("#" + text);
} else if (typeObject.equalsIgnoreCase("first")) {
ownFrag.setBackgroundColor("#" + text);
first.setBackgroundColor("#" + text);
} else if (typeObject.equalsIgnoreCase("execute")) {
execute.setBackgroundColor("#" + text);
} else if (typeObject.equalsIgnoreCase("story")) {
story.setBackgroundColor("#" + text);
} else if (typeObject.equalsIgnoreCase("intro")) {
intro.setBackgroundColor("#" + text);
} else if (typeObject.equalsIgnoreCase("mission")) {
mission.setBackgroundColor("#" + text);
} else if (typeObject.equalsIgnoreCase("question")) {
question.setBackgroundColor("#" + text);
} else if (typeObject.equalsIgnoreCase("info")) {
info.setBackgroundColor("#" + text);
}
break;
...
因此,如果我可以創建一個“全局” Fragment 然后程序自己找出它必須調用哪個類的哪個函數(多態?)
另一種選擇是使 Fragment 抽象並讓您的類擴展它。 然后,如果可能,您還可以添加一些共享功能。
根據您評論 Fragment 是一個內置類並且不可編輯,似乎有幾個選項。 您可以引用擴展 Fragment 一般的對象 <? extends Fragment> 或者通過在 Fragment 上創建一個包裝類來保存和維護它的一個實例。 這會給你更多的控制。
一個簡單的例子可能如下所示。
class CannotModify{
public void doSomething(){}
}
public interface AddThisIfYouWant{
public void doSomething();
}
public class Wrap extends CannotModify, implements AddThisIfYouWant{
private final CannotModify yourInstance;
public Wrap(){
this.yourInstance=new CannotModify();
}
@Override
public void doSomething(){
super.doSomething();
}
}
如果您只需要在 Fragment 級別引用您的對象,您也可以只擴展 Fragment。 例如:
public class AnotherFragment extends Fragment{...}
...
public void somethingWithFragments(List<? extends Fragment> fragments){
for(Fragment fragment:fragments){
...
}
}
...
在 Fragment 是內置類的信息之后編輯。
您的基本問題的答案是:不,在 Java 中,您不能使用新行為擴展預定義的類(例如,使其實現另一個接口)。 例如,您可以在 Objective-C 中做到這一點。 但在您的情況下,您似乎不需要它。
定義 Fragment 的子類,它具有您需要的行為,並實現您需要它實現的接口,並從該子類派生其他類。
舊答案:
你自己已經給出了答案:
但問題是,如果我想使用多態,我需要一個接口,並且接口應該是一個 Fragment
正如您現在繪制的類圖一樣,Fragment 類沒有數據也沒有默認行為,因此完全沒有理由讓它成為所有其他類的基類。 只需將 Fragment 定義為一個接口(帶有您需要的方法聲明),並為其他類指定它們實現該接口。
您應該為 Fragment 創建一個接口並使所有類都擴展該接口
首先。 沒有接口不能擴展類,這會破壞接口的語義(只有簽名)。
你可以做的是讓“片段”簡單地實現新創建的接口。
您可以創建一個通用的FragmentInterface
和其他擴展該FragmentInterface
接口。
當您可以制作基本接口和擴展該基本接口的其他接口時,為什么只需要 1 個接口?
順便說一句,一個類也可以實現多個interfaces
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.