私のクラスは、同時に2つのクラスを拡張する必要があります。
public class Preferences extends AbstractBillingActivity {
public class Preferences extends PreferenceActivity {
その方法は?
Upd。これは不可能であるため、 AbstractBillingActivity を環境設定でどのように使用すればよいですか?
Upd2。インターフェイスを使用する場合、次のものを作成する必要があります。
BillingInterface
public interface BillingInterface extends PreferenceActivity, AbstractBillingActivity {
}
PreferenceActivity
public interface PreferenceActivity {
}
AbstractBillingActivity
public interface AbstractBillingActivity {
void onCreate(Bundle savedInstanceState);
}
その後
public class Preferences implements BillingInterface {
Javaは多重継承をサポートしていません。
私が考えることができるいくつかの回避策があります:
1つ目は集計です。これら2つのアクティビティをフィールドとして取るクラスを作成します。
2番目は、インターフェイスを使用することです。
3番目はデザインを再考することです。Preferences
クラスがPreferenceActivity
andとAbstractBillingActivity
の両方であるのは理にかなっていますか?
Javaは多重継承をサポートしていません。複数のインターフェイスを実装できますが、複数のクラスを拡張することはできません。
別の解決策は、2番目のクラスを拡張するプライベートな内部クラスを作成することです。例:JMenuItem
およびAbstractAction
を拡張するクラス:
public class MyClass extends JMenuItem {
private class MyAction extends AbstractAction {
// This class can access everything from its parent...
}
}
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
いいえ、クラスを2つのクラスに拡張することはできません。
可能な解決策は、それを別のクラスから拡張し、that classを別のクラスから再度拡張することです。
Javaは多重継承をサポートしていません。ただし、インターフェイスを使用して問題を解決できる場合があります。
最も簡単な解決策は、AbstractBillingActivity
とPreferenceActivity
のインターフェイスを作成し、両方を実装することです。
あなたが求めているのは多重継承であり、それはいくつかの理由で非常に問題があります。 Javaでは、多重継承は特に回避されました。代わりに、複数のインターフェイス実装をサポートするように選択されました。これは適切な回避策です。
Javaは多重継承をサポートしていません。そのため、2つの異なるクラスから同時にクラスを拡張することはできません。
むしろ、単一のクラスを使用して拡張し、interfaces
を使用して追加機能を含めます。
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つのクラスを拡張することとまったく同じではありませんが、場合によっては(上記の例のように)、状況を解決できます。特性を使用する前に設計を分析することを強くお勧めします。通常、それらは必要ではなく、継承をうまく実装することはできません(たとえば、特性で保護されたメソッドを使用することはできません)。可能であれば、受け入れられた回答の推奨事項に従ってください。
また、内部クラスの代わりに、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
}
拡張したいクラスにメソッドのみが含まれる場合に役立つ回避策を考えることができます。
これらのクラスをインターフェイスとして記述します。 Javaでは、任意の数のインターフェイスを実装し、メソッドをインターフェイスのデフォルトメソッドとして実装できます。
複数のクラスのメソッドを使用することに興味がある場合、それにアプローチする最良の方法は、継承の代わりにコンポジションを使用することです
マルチレベル階層に精通していますか?
サブクラスを別のクラスのスーパークラスとして使用できます。
これを試すことができます。
public class PreferenceActivity extends AbstractBillingActivity {}
それから
public class Preferences extends PreferenceActivity {}
この場合、PreferencesクラスはPreferencesActivityとAbstractBillingActivityの両方を継承します。