Java 一个班能扩展两个班吗?
我的班级应该同时扩展两个班级:Java 一个班能扩展两个班吗?,java,android,multiple-inheritance,Java,Android,Multiple Inheritance,我的班级应该同时扩展两个班级: public class Preferences extends AbstractBillingActivity { public class Preferences extends PreferenceActivity { 如何做到这一点 Upd。既然这是不可能的,那么我应该如何在首选项中使用它呢 Upd2。如果我使用接口,我应该创建: 计费接口 public interface BillingInterface extends PreferenceActi
public class Preferences extends AbstractBillingActivity {
public class Preferences extends PreferenceActivity {
如何做到这一点
Upd。既然这是不可能的,那么我应该如何在首选项中使用它呢
Upd2。如果我使用接口,我应该创建:
public interface BillingInterface extends PreferenceActivity, AbstractBillingActivity {
}
public interface PreferenceActivity {
}
public interface AbstractBillingActivity {
void onCreate(Bundle savedInstanceState);
}
public class Preferences implements BillingInterface {
Java不支持多重继承 我可以想出一些变通办法: 第一个是聚合:创建一个将这两个活动作为字段的类 第二是使用接口
第三个问题是重新思考您的设计:
Preferences
类既是PreferenceActivity
又是AbstractBillingActivity
,这有意义吗?一个可能的解决方案是使它从另一个类扩展,并使那个类再次从另一个类扩展。您要问的是多重继承,它有很多问题。Java特别避免了多重继承;相反,我们选择支持多接口实现,这是合适的解决方法。Java不支持多重继承,这就是为什么不能同时从两个不同的类扩展一个类 相反,使用单个类进行扩展,并使用
接口
包含附加功能。Java1.8(以及Groovy和Scala)有一个名为“”的东西,它是带有预定义默认方法体的接口。通过实现使用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
另一个解决方案是创建扩展第二个类的私有内部类。 e、 g扩展
JMenuItem
和AbstractAction
的类:
public class MyClass extends JMenuItem {
private class MyAction extends AbstractAction {
// This class can access everything from its parent...
}
}
Java不支持多重继承。但是,您的问题可以通过使用接口来解决
最简单的解决方案是为
AbstractBillingActivity
和PreferenceActivity
创建一个接口,并将它们都实现。熟悉多级层次结构吗
您可以将子类用作另一个类的超类
你可以试试这个
public class PreferenceActivity extends AbstractBillingActivity {}
然后
在这种情况下,Preferences类同时继承PreferencesActivity和AbstractBillingActivity。如果要扩展的类只包含方法,我可以想出一种解决方法 将这些类编写为接口。在Java中,可以实现任意数量的接口,并将这些方法作为接口中的默认方法来实现
此外,您可以使用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
}
如果您对使用来自多个类的方法感兴趣,最好的方法是使用组合而不是继承,在Groovy中,您可以使用而不是类。由于它们的行为类似于抽象类(您可以指定抽象方法,但仍可以实现其他方法),因此可以执行以下操作:
trait EmployeeTrait{
int getId(){
返回1000//默认值
}
抽象字符串getName()//必需
}
特质顾客{
字符串getCompany(){
返回“内部”//默认值
}
抽象字符串getAddress()
}
类InternalCustomer实现EmployeeTrait、CustomerTrait{
字符串getName(){…}
字符串getAddress(){…}
}
def internalCustomer=新的internalCustomer()
println internalCustomer.id//1000
println internalCustomer.company//Internal
需要指出的是,它与扩展两个类并不完全相同,但在某些情况下(如上面的示例),它可以解决这种情况。我强烈建议在开始使用traits之前分析您的设计,通常它们不是必需的,并且您将无法很好地实现继承(例如,您不能在traits中使用受保护的方法)。如果可能,遵循公认答案的建议。你不能:@LA_389;:一个类可以实现多个接口,但只扩展一个类,因此你可以使用所有接口实现你的类,而无需将所有接口合并到一个接口中。一旦你创建了AbstractBillingActivity和PreferenceActivity作为接口,您不需要创建另一个名为BillingInterface的接口。相反,请使用以下代码:公共类首选项实现AbstractBillingActivity,PreferenceActivity那么我应该如何将AbstractBillingActivity()与首选项一起使用?我不知道。乍一看,想要同时扩展名为
首选项
和计费活动
的东西是没有意义的-我看不到这两者之间有任何联系。如果您的首选项需要存储计费活动,请使用合成,反之亦然。我在哪里可以阅读有关合成的内容?这对我来说是新鲜事。或者,你能举个例子吗?非常感谢。只是有一个对象作为另一个对象的成员。请检查我的问题,upd2?我以前从未使用过接口。用这种方法我们真的能达到上述目标吗?如果很高兴知道的话我有一个问题要问你。。我认为java中存在多重继承。让我来解释一下A类B类。A类扩展了B类和B类
class Phone {
DeviceInfo info;
String phoneNumber;
Stryng phoneType;
//sets; gets
}