0

我知道 Java 不允许我们扩展一个以上的类。我知道接口也存在,这次我不想使用它们。是否有某种技巧或解决方法可以在 Java 中扩展多个类?如果是,请同时包含示例代码。

4

12 回答 12

3

您可以使用界面和组合 轻松完成。

问题是你为什么会问这样的事情?为什么你不想“此时”使用接口?

你必须知道Java只允许实现的单一继承。你已经在 SO 呆了七个月,所以你肯定知道如何使用搜索功能。这个问题在这里被反复问过。

更有创意。JPanel 没有理由必须是可观察的。JPanel 用于渲染。我同意它的模型数据可能希望是可观察的。一定要用组合来做。

于 2013-04-26T09:48:15.690 回答
3

不,与 C++ 不同,您不能扩展多个类,但可以实现多个接口。

于 2013-04-26T09:43:08.570 回答
2

不。

去。interfaces没有多个inheritance in Java.

多重继承会导致菱形问题。

JAVA 省略了 C++ 中许多很少使用、难以理解、令人困惑的特性,根据我们的经验,这些特性带来的痛苦多于好处。这主要包括运算符重载(尽管它确实有方法重载)、多重继承和广泛的自动强制 _ James Gosling 博士

于 2013-04-26T09:43:07.450 回答
2

java中的多重继承通常是通过实现多个接口来完成的。您不能扩展多个类。一种可能的解决方法可能是使用某种对象组合来进行实例聚合。

于 2013-04-26T09:43:20.483 回答
1

多重继承增加了复杂性而没有什么好处,这就是为什么它在 java 中不存在为什么在 Java 或 C# 中不允许多重继承?

我能想到的一种方法是用支持它的语言(例如C++)编写需要多重继承的程序,然后使您的Java 代码与该程序的输出交互,例如使用文件或数据库。

于 2013-04-26T09:48:30.880 回答
1

Java不支持这个类。你可以使用多个接口。你可以找到java中多重继承的问题

您可以使用内部类,例如

 public class class1 extends class2{
  class Inner extends class3{

    }
   }

看这里

于 2013-04-26T09:43:10.373 回答
1

可能这有帮助

    class One{
    void oneMethod(){

    }
}

class Two extends One{
    void TwoMethod(){

    }
}

class Abc extends Two{

    @Override
    void oneMethod() {
        // TODO Auto-generated method stub
        super.oneMethod();
    }

    @Override
    void TwoMethod() {
        // TODO Auto-generated method stub
        super.TwoMethod();
    }


}
于 2013-04-26T09:47:57.440 回答
0

答案是否定的。但如果有帮助,您可以这样做:

A 扩展 B
B 扩展 C

所以 A 扩展了 B 和 C

于 2013-04-26T09:45:52.503 回答
0

改用接口。以下是代码中的样子:

public Class ClassName implements Interface1, Interface2 {

    Methods, fields etc...

}
于 2013-04-26T09:46:01.430 回答
0

我会说是的,你可以——有点让很多人不高兴。

这当然不容易,您必须使用反射,但在这里您会找到一个示例,该示例允许您动态扩展一个对象与另一个对象。显然,一旦你能做到这一点,你就可以扩展另一个。

本质上,它使用Proxy类来拦截方法调用并将它们定向到两个对象中的一个或另一个 - 这实现了A overrides B. 这不是您正在寻找的东西,但可以很容易地对其进行调整以检测两个类中存在的方法并调用它们 - 从而实现A extends B动态 - 种类。

请注意,您需要阅读链接中标题为“使用动态代理的动态对象适配器”部分的部分。

于 2013-04-26T12:29:52.410 回答
0

为了避免 菱形问题,Java 不支持通过类进行多重继承,但它支持使用接口。所以你可以使用关联关系。例如

Class A {}
Class B {}
Class C implements SomeInterface {
  A a;
  B b;
  // setter getter for a and b and other methods
}
于 2013-04-26T09:46:25.607 回答
0

您可以使用功能查找。

class Vehicle {

    T <T> lookup(Class<T> klazz) {
        return map.get(klazz); // typically
    }
}

interface Flyable {
    void fly();
}

Vehicle x;
Flyable f = x.lookup(Flyable.class);
if (f != null) {
    f.fly();
}

这解耦了类。但它需要运行时检查。

它使用委托:实现查找的类/接口的本地成员。

优势:

您可以从 Vehicle 派生一个既可以飞行(Flyable)又可以潜水(Diving)的类。飞行可以通过共享类的实例来实现。您甚至可以动态组合功能(为船添加轮子)。

这通常比实现多个接口更好,其中fly()要么是代码副本,要么委托给 Flyable 字段(具有共享实现类)。

尤其是涉及多个接口/类时,否则会冒着在基类对象(此处为车辆)上使用案例和不安全强制转换的风险,忘记if (x instanceof Boat).

于 2013-04-26T09:46:56.823 回答