2011-07-05 46 views
48

我的類應該同時擴展兩個類:一個類可以擴展兩個類嗎?

public class Preferences extends AbstractBillingActivity { 

public class Preferences extends PreferenceActivity { 

怎麼辦呢?

Upd。由於這是不可能的,那麼我應該如何將AbstractBillingActivity與首選項一起使用呢?

Upd2。如果我和接口去,我應該:

  1. BillingInterface

    public interface BillingInterface extends PreferenceActivity, AbstractBillingActivity { 
    
    } 
    
  2. PreferenceActivity

    public interface PreferenceActivity { 
    
    } 
    
  3. AbstractBillingActivity

    public interface AbstractBillingActivity { 
    
         void onCreate(Bundle savedInstanceState); 
    
    } 
    

然後

public class Preferences implements BillingInterface { 
+0

你不能:http://www.lavaworld.com/javaworld/javaqa/2002-07/02-qa-0719-multinheritance.html –

+1

@LA_:一個類可以實現多個接口,但只擴展一個類,所以如果你願意的話,你可以用你的所有接口來實現你的類,而不必將所有接口合併到一個接口中。 –

+0

一旦創建了AbstractBillingActivity和PreferenceActivity作爲接口,就不需要創建另一個名爲BillingInterface的接口。而是使用下面的代碼: public class Preferences實現AbstractBillingActivity,PreferenceActivity – Logan

回答

39

Java不支持多重繼承。

有幾個解決方法,我能想到的:

首先是聚集:使一個類,需要這兩個活動領域。

第二個是使用接口。

三是重新思考你的設計:是否有意義的Preferences類既是PreferenceActivityAbstractBillingActivity

21

Java不支持多繼承。您可以實現多個接口,但不能擴展多個類。

+0

我應該如何使用那個AbstractBillingActivity(https://github.com/robotmedia/AndroidBillingLibrary)和Preferences? –

+1

我不知道。乍一看,它不會想要擴展名爲'Preferences'和'BillingActivity'的東西 - 我沒有看到這兩者之間的任何聯繫。如果您的偏好需要存儲結算活動,或者反之亦然,請使用組合。 – Mat

+0

我可以在哪裏閱讀關於作文的內容?這對我來說是新東西。或者,你可以請一個例子嗎?謝謝。 –

4

不,你不能讓一個類擴展到兩個類。

一個可能的解決方案是使其從另一個類擴展,並使類再次擴展。

+1

我們真的可以用這種方法達到上述目標嗎?如果很高興知道。 –

1

你在問什麼是多重繼承,並且由於多種原因,這是非常有問題的。 Java中特別避免了多重繼承;選擇是爲了支持多接口實現,相反,這是適當的解決方法。

+0

我有一個問題給你.. 我認爲java中存在多繼承。讓我解釋一下A類B類。A類擴展B類,A類也擴展了對象類。所以我們怎麼能說java不支持多繼承.. –

0

Java不支持多繼承,這就是爲什麼你不能同時從兩個不同類擴展一個類。

確切地說,使用單個類來擴展並使用interfaces來包含附加功能。

+0

可以請檢查我的問題,upd2?我以前從未使用過接口。 –

7

Java 1.8(以及Groovy和Scala)有一個名爲「Interface Defender Methods」的東西,它們是與預定義的默認方法體的接口。通過實現使用Defender方法的多個接口,可以有效地擴展兩個接口對象的行爲。

此外,在Groovy中,使用@Delegate註釋,您可以擴展兩個或更多類的行爲(當這些類包含同名的方法時需要注意)。此代碼證明:

class Photo { 
    int width 
    int height 
}  
class Selection { 
    @Delegate Photo photo  
    String title 
    String caption 
}  
def photo = new Photo(width: 640, height: 480) 
def selection = new Selection(title: "Groovy", caption: "Groovy", photo: photo) 
assert selection.title == "Groovy" 
assert selection.caption == "Groovy"  
assert selection.width == 640 
assert selection.height == 480 
+1

附錄:我收回了這個答案:我已經知道如果你需要類似於多繼承的行爲,「對象組合」可能就是你想要使用的。另外,實現多個接口不會像多重繼承:您不能擁有一個實現兩個接口的類,其中兩個接口都包含具有相同簽名的默認方法,除非該類爲該方法本身提供實現;因此我們仍然有效地具有單一繼承。總是在學習...... – djangofan

8

另一種解決方案是創建一個私有的內部類,它擴展了第二個類。 e.g擴展JMenuItemAbstractAction類:

public class MyClass extends JMenuItem { 


    private class MyAction extends AbstractAction { 
     // This class can access everything from its parent... 
    } 

} 
1

Java不支持多重繼承。但是,您的問題可能會使用接口來解決。

最簡單的解決方案是創建一個接口AbstractBillingActivityPreferenceActivity並實現它們兩者。

相關問題