2011-07-05 8 views
48

私のクラスでは、同時に2つのクラスを拡張する必要があります。そうするための方法1つのクラスで2つのクラスを拡張できますか?

public class Preferences extends AbstractBillingActivity { 

public class Preferences extends PreferenceActivity { 

更新。これは不可能なので、私はどのようにして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.javaworld.com/javaworld/javaqa/2002-07/02-qa-0719-multinheritance.html –

+1

@LA_:クラスは複数のインターフェイスを実装できますが、1つのクラスしたがって、必要に応じて、すべてのインターフェースを1つのインターフェースに統合することなく、クラスをすべてのインターフェースで実装することができます。 –

+0

AbstractBillingActivityとPreferenceActivityをインターフェースとして作成したら、BillingInterfaceという別のインターフェースを作成する必要はありません。代わりにこのコードを使用してください: public class PreferencesはAbstractBillingActivity、PreferenceActivityを実装します – Logan

答えて

39

Javaは多重継承をサポートしていません。

私は考えることができるいくつかの回避策があります。

は、最初の集合体である:フィールドとして、これら2つのアクティビティをとるクラスを作ります。

第2は、インターフェイスを使用することです。

第三は、あなたのデザインを再考することである:それはPreferenceActivityAbstractBillingActivityの両方であることをPreferencesクラスの意味を成していますか?

21

Javaは多重継承をサポートしていません。複数のインタフェースを実装できますが、複数のクラスを拡張することはできません。

+0

Preferencesを使用してAbstractBillingActivity(https://github.com/robotmedia/AndroidBillingLibrary)をどのように使用すればよいですか? –

+1

私は分かりません。一見すると、 'Preferences'と' BillingActivity'の両方を拡張したいという感覚はありません。これらの2つの間には何の関係もありません。あなたの好みが請求活動を保存する必要がある場合、またはその逆の場合はコンポジションを使用してください。 – Mat

+0

私は構成についてどこで読むことができますか?これは私にとって新しいものです。または、例を投稿してもらえますか?ありがとうございました。 –

4

いいえいいえ、クラスを2つのクラスに拡張することはできません。

可能な解決策は、別のクラスから継承し、クラスが別のクラスに再度拡張することです。

+1

私たちはこのアプローチで上記の目標を達成することができますか?もし知っていると良いです。 –

1

あなたが求めているのは、複数の継承であり、さまざまな理由で非常に問題があります。 Javaでは多重継承が特に避けられました。代わりに適切な回避策である複数のインタフェース実装をサポートするように選択されました。

+0

私はあなたのために1つの質問があります.. 私は複数の継承がjavaに存在すると思います。クラスAはクラスBを拡張し、クラスAもオブジェクトクラスを拡張します。どのように我々は複数の継承をサポートしていないjavaと言うことができる.. –

0

Javaは複数の継承をサポートしていないため、同時に2つの異なるクラスからクラスを拡張することはできません。

より、拡張するには単一のクラスを使用し、追加の機能を追加するにはinterfacesを使用します。

+0

あなたは私の質問を確認してください、upd2?私は前にインターフェイスで作業していませんでした。 –

7

Java 1.8(GroovyとScalaと同様)には、あらかじめ定義されたデフォルトのメソッド本体とのインターフェイスである "Interface Defender Methods"というものがあります。ディフェンダーメソッドを使用する複数のインターフェイスを実装することにより、2つのインターフェイスオブジェクトの動作を効果的に拡張できます。

また、@Delegateアノテーションを使用するGroovyでは、2つ以上のクラスの動作を拡張することができます(これらのクラスには同じ名前のメソッドが含まれていると警告があります)。このコードはそれを証明します:

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

補遺:私はこの答えを撤回しています。私はそれ以来、複数の継承に類似した振る舞いが必要な場合、「オブジェクトの構成」があなたが使いたいと思っていることを学びました。また、複数のインタフェースを実装すると、多重継承のようにはなりません。クラスがそのメソッド自体の実装を提供しない限り、両方のインタフェースに同じシグネチャを持つデフォルトのメソッドが含まれている2つのインタフェースを実装するクラスはできません。したがって、私たちは依然として単一の継承を効果的に持ちます。いつも学ぶ... – djangofan

8

もう1つの解決策は、2番目のクラスを拡張するプライベート内部クラスを作成することです。 JMenuItemAbstractActionを拡張 例えばクラス:

public class MyClass extends JMenuItem { 


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

} 
1

Javaは多重継承をサポートしていません。しかし、あなたの問題はインターフェイスを使って解決されるかもしれません。

最も簡単な解決策は、AbstractBillingActivityPreferenceActivityのインターフェイスを作成し、両方を実装することです。

関連する問題