Kelas saya harus memperpanjang dua kelas pada waktu yang sama:
public class Preferences extends AbstractBillingActivity {
public class Preferences extends PreferenceActivity {
Bagaimana untuk melakukannya?
Upd. Karena hal ini tidak mungkin, bagaimana saya harus menggunakan yang AbstractBillingActivity dengan Preferensi kemudian?
Upd2. Jika aku pergi dengan antarmuka, yang harus saya buat:
antarmuka publik BillingInterface meluas PreferenceActivity, AbstractBillingActivity {
}
antarmuka publik PreferenceActivity {
}
antarmuka publik AbstractBillingActivity {
void onCreate(Bundle savedInstanceState);
}
dan kemudian
public class Preferences implements BillingInterface {
Java tidak mendukung multiple inheritance.
Ada beberapa cara yang dapat saya pikirkan:
Yang pertama adalah agregasi: membuat kelas yang mengambil dua kegiatan sebagai bidang.
Yang kedua adalah untuk menggunakan antarmuka.
Yang ketiga adalah untuk memikirkan kembali desain anda: apakah masuk akal untuk Preferensi
kelas kedua PreferenceActivity
and sebuah AbstractBillingActivity
?
Solusi lain adalah untuk menciptakan sebuah pribadi dalam kelas yang membentang di kedua kelas.
e.g kelas yang meluas JMenuItem
dan AbstractAction
:
public class MyClass extends JMenuItem {
private class MyAction extends AbstractAction {
// This class can access everything from its parent...
}
}
Jawa 1.8 (serta Groovy dan Scala) memiliki hal yang disebut "Interface Bek Metode", yang merupakan antarmuka dengan pra-didefinisikan default metode tubuh. Dengan menerapkan beberapa interface yang digunakan bek metode, anda bisa secara efektif, dengan cara, memperpanjang perilaku antarmuka dua benda.
Juga, di Groovy, menggunakan @Mendelegasikan penjelasan, anda dapat memperpanjang perilaku dari dua atau lebih kelas-kelas (dengan peringatan ketika orang-orang kelas yang berisi metode dengan nama yang sama). Kode ini membuktikan hal itu:
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
Java tidak mendukung multiple inheritance. Namun, masalah anda dapat diselesaikan dengan menggunakan antarmuka.
Solusi termudah adalah membuat sebuah antarmuka untuk AbstractBillingActivity
dan `PreferenceActivity ' dan menerapkan mereka berdua.
Apa yang anda're bertanya tentang multiple inheritance, dan's sangat bermasalah untuk sejumlah alasan. Beberapa warisan yang secara khusus dihindari di Jawa; pilihan itu dibuat untuk mendukung beberapa antarmuka implementasi, bukan, yang sesuai solusi.
Akrab dengan hirarki bertingkat?
Anda dapat menggunakan subclass sebagai superclass ke kelas lain.
Anda dapat mencoba ini.
public class PreferenceActivity extends AbstractBillingActivity {}
kemudian
public class Preferences extends PreferenceActivity {}
Dalam hal ini, Preferensi kelas mewarisi kedua PreferencesActivity dan AbstractBillingActivity juga.
Di Groovy, anda dapat menggunakan sifat bukan kelas. Karena mereka bertindak mirip dengan kelas abstrak (dalam cara bahwa anda dapat menentukan metode abstrak, tetapi anda masih dapat mengimplementasikan lain-lain), anda dapat melakukan sesuatu seperti:
``jawa sifat EmployeeTrait { int getId() { kembali 1000 //nilai Default } abstrak String getName() //Dibutuhkan }
sifat CustomerTrait { String getCompany() { kembali "Internal" // nilai Default } abstrak String getAddress() }
kelas InternalCustomer mengimplementasikan EmployeeTrait, CustomerTrait { String getName() { ... } String getAddress() { ... } }
def internalCustomer = new InternalCustomer() println internalCustomer.id // 1000 println internalCustomer.perusahaan /Internal/
``
Hanya untuk menunjukkan, yang tidak persis sama seperti memperpanjang dua kelas, tetapi dalam beberapa kasus (seperti contoh di atas), hal ini dapat memecahkan situasi. Saya sangat menyarankan untuk menganalisis desain anda sebelum melompat ke dalam menggunakan ciri-ciri, biasanya mereka tidak diperlukan, dan anda tidak't dapat dengan baik menerapkan warisan (misalnya, anda dapat't menggunakan dilindungi metode dalam ciri-ciri). Ikuti jawaban yang diterima's rekomendasi jika mungkin.
Saya bisa memikirkan solusi yang dapat membantu jika kelas anda ingin memperpanjang hanya mencakup metode.
Tuliskan kelas-kelas ini sebagai interface. Di pulau Jawa, anda dapat menerapkan sejumlah interface, dan menerapkan metode-metode sebagai default metode dalam interface.
Juga, bukan dalam kelas, anda dapat menggunakan 2 atau lebih kelas-kelas sebagai bidang.
Misalnya:
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
}
Jadi, di sini anda memiliki orang yang bisa memiliki beberapa Ponsel dengan nomor dan jenis, juga anda memiliki DeviceInfo untuk Telepon itu.
Juga, it's mungkin lebih baik untuk menggunakan DeviceInfo sebagai bidang ke Ponsel kelas, seperti
class Phone {
DeviceInfo info;
String phoneNumber;
Stryng phoneType;
//sets; gets
}
Java tidak mendukung multiple inheritance, yang's mengapa anda dapat't memperpanjang kelas dari dua kelas yang berbeda pada waktu yang sama.
Sebaliknya, menggunakan satu kelas untuk memperpanjang dari, dan menggunakan interface
untuk menyediakan fungsionalitas tambahan.