我的班级应该同时扩展两个班级:
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 {
答案 0 :(得分:46)
Java不支持多重继承。
我可以想到一些解决方法:
第一个是聚合:创建一个将这两个活动作为字段的类。
第二种是使用接口。
第三是重新考虑你的设计:Preferences
课程是PreferenceActivity
和 AbstractBillingActivity
是否有意义?
答案 1 :(得分:23)
Java不支持多重继承。您可以实现多个接口,但不能扩展多个类。
答案 2 :(得分:11)
另一个解决方案是创建一个扩展第二个类的私有内部类。
例如,扩展JMenuItem
和AbstractAction
的类:
public class MyClass extends JMenuItem {
private class MyAction extends AbstractAction {
// This class can access everything from its parent...
}
}
答案 3 :(得分:8)
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
答案 4 :(得分:4)
不,你不能让一个类扩展到两个类。
一种可能的解决方案是让它从另一个类扩展,并使 类再次从另一个类扩展。
答案 5 :(得分:2)
Java不支持多重继承。但是,使用接口可以解决您的问题。
最简单的解决方案是为AbstractBillingActivity
和PreferenceActivity
创建一个界面并同时实现它们。
答案 6 :(得分:1)
您要问的是多重继承,并且由于多种原因而存在问题。在Java中特别避免了多重继承;选择是为了支持多个接口实现,相反,这是适当的解决方法。
答案 7 :(得分:0)
Java不支持多重继承,这就是为什么你不能同时从两个不同的类扩展一个类的原因。
相反,使用单个类进行扩展,并使用interfaces
包含其他功能。
答案 8 :(得分:0)
熟悉多级层次结构吗?
您可以将子类用作另一个类的超类。
你可以试试这个。
public class PreferenceActivity extends AbstractBillingActivity {}
然后
public class Preferences extends PreferenceActivity {}
在这种情况下,Preferences类也继承了PreferencesActivity和AbstractBillingActivity。
答案 9 :(得分:0)
我想出一种解决方法,如果您要扩展的类仅包含方法,则可以提供帮助。
将这些类编写为接口。在Java中,您可以实现任意数量的接口,并将这些方法实现为接口中的默认方法。
答案 10 :(得分:0)
此外,您可以使用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
}
答案 11 :(得分:0)
如果您对使用多个类中的方法感兴趣,那么最好的方法是使用Composition而不是Inheritance
答案 12 :(得分:0)
在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
仅需指出,它与扩展两个类并不完全相同,但是在某些情况下(如上述示例),它可以解决这种情况。我强烈建议您在使用特征之前先分析您的设计,通常不需要使用它们,并且您将无法很好地实现继承(例如,不能在特征中使用受保护的方法)。尽可能遵循接受的答案的建议。