web-dev-qa-db-ja.com

1つのクラスで2つのクラスを拡張できますか?

私のクラスは、同時に2つのクラスを拡張する必要があります。

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 {
58
LA_

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

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

1つ目は集計です。これら2つのアクティビティをフィールドとして取るクラスを作成します。

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

3番目はデザインを再考することです。PreferencesクラスがPreferenceActivityandAbstractBillingActivityの両方であるのは理にかなっていますか?

50

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

24
Mat

別の解決策は、2番目のクラスを拡張するプライベートな内部クラスを作成することです。例:JMenuItemおよびAbstractActionを拡張するクラス:

public class MyClass extends JMenuItem {


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

}
14
Jonny Rimkus

Java 1.8(およびGroovyとScala)には、「 Interface Defender Methods 」と呼ばれるものがあります。これは、事前定義されたデフォルトのメソッド本体を持つインターフェースです。ディフェンダーメソッドを使用する複数のインターフェイスを実装すると、2つのインターフェイスオブジェクトの動作を効率的に拡張できます。

また、Groovyでは、@ Delegateアノテーションを使用して、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
10
djangofan

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

可能な解決策は、それを別のクラスから拡張し、that classを別のクラスから再度拡張することです。

5
Jules

Javaは多重継承をサポートしていません。ただし、インターフェイスを使用して問題を解決できる場合があります。

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

3
nejckorasa

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

1
Paul Sonier

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

むしろ、単一のクラスを使用して拡張し、interfacesを使用して追加機能を含めます。

0
MD Sayem Ahmed

Groovyでは、クラスの代わりに trait を使用できます。抽象クラスと同様に機能するため(抽象メソッドを指定できる方法で、他のメソッドを実装することもできます)、次のようなことができます。

trait EmployeeTrait {
    int getId() {
         return 1000 //Default value
    }
    abstract String getName() //Required
}

trait CustomerTrait {
    String getCompany() {
        return "Internal" // Default value
    }
    abstract String getAddress()
}

class InternalCustomer implements EmployeeTrait, CustomerTrait {
    String getName() { ... }
    String getAddress() { ... }
}

def internalCustomer = new InternalCustomer()
println internalCustomer.id // 1000
println internalCustomer.company //Internal

指摘するだけですが、2つのクラスを拡張することとまったく同じではありませんが、場合によっては(上記の例のように)、状況を解決できます。特性を使用する前に設計を分析することを強くお勧めします。通常、それらは必要ではなく、継承をうまく実装することはできません(たとえば、特性で保護されたメソッドを使用することはできません)。可能であれば、受け入れられた回答の推奨事項に従ってください。

0
lepe

また、内部クラスの代わりに、2つ以上のクラスをフィールドとして使用できます。

例えば:

Class Man{
private Phone ownPhone;
private DeviceInfo info;
//sets; gets
}
Class Phone{
private String phoneType;
private Long phoneNumber;
//sets; gets
}

Class DeviceInfo{

String phoneModel;
String cellPhoneOs;
String osVersion;
String phoneRam;
//sets; gets

}

そのため、ここには、電話番号とタイプを持つ電話を持つことができる人がいます。また、その電話のDeviceInfoも持っています。

また、次のように、DeviceInfoをPhoneクラスのフィールドとして使用することをお勧めします

class Phone {
DeviceInfo info;
String phoneNumber;
Stryng phoneType;
//sets; gets
}
0
Dred

拡張したいクラスにメソッドのみが含まれる場合に役立つ回避策を考えることができます。

これらのクラスをインターフェイスとして記述します。 Javaでは、任意の数のインターフェイスを実装し、メソッドをインターフェイスのデフォルトメソッドとして実装できます。

https://www.geeksforgeeks.org/default-methods-Java/

0
CrazySynthax

複数のクラスのメソッドを使用することに興味がある場合、それにアプローチする最良の方法は、継承の代わりにコンポジションを使用することです

0
Santhosh

マルチレベル階層に精通していますか?

サブクラスを別のクラスのスーパークラスとして使用できます。

これを試すことができます。

public class PreferenceActivity extends AbstractBillingActivity {}

それから

public class Preferences extends PreferenceActivity {}

この場合、PreferencesクラスはPreferencesActivityとAbstractBillingActivityの両方を継承します。

0
AyukNayr