继承类或其子类的Java类

继承类或其子类的Java类,java,class,inheritance,Java,Class,Inheritance,我有一个基本的类a,它提供了一些功能,而子类B扩展了a,它在a之上提供了额外的功能 假设类C,D和E扩展A,我将如何构造扩展B的C,D和E类(不创建基本上重复C,D和E) 除了扩展B的类之外,还需要扩展A的类C、D和E 例如(请随意改进): 目标是能够创建A或B类型的对象,这些对象包括集合{C,D,E}中的特征,而不必为所有可能的组合创建类如果类B扩展了A,则可以使类(C,D和E)扩展类B而不是A。通过这三个类(C,D和E)可以使用类B和类A(继承层次结构)中可用的公共功能(属性和方法)。类B扩

我有一个基本的
类a
,它提供了一些功能,而子类
B扩展了a
,它在
a
之上提供了额外的功能

假设类
C
D
E
扩展
A
,我将如何构造扩展
B
C
D
E
类(不创建基本上重复
C
D
E

除了扩展
B
的类之外,还需要扩展
A
的类
C
D
E

例如(请随意改进):


目标是能够创建
A
B
类型的对象,这些对象包括集合
{C,D,E}
中的特征,而不必为所有可能的组合创建类

如果类B扩展了A,则可以使类(C,D和E)扩展类B而不是A。通过这三个类(C,D和E)可以使用类B和类A(继承层次结构)中可用的公共功能(属性和方法)。

类B扩展了类A。因此类A的所有功能都将在类B中继承

Class B extends A{}
现在您希望类C、D、E扩展类A和B的功能,这可以通过简单地扩展类B而不是类A来实现

Class C extends B{}
Class D extends B{}
Class E extends B{}

直接扩展B类而不是A类。如果您深入了解,您可以更好地理解在Ball类中添加Ball-Like roll()、bounce()和spin()的基本功能,因为所有球都应该具有这三个功能。在类B中扩展类A,这样你可以实例化Ball和Beach Ball,其中Ball和Beach Ball都有滚动反弹和旋转,Beach Ball有自己的特性在java中,一个类只能扩展一个类。如果希望C、D和E的实现扩展B而不是A,那么必须创建新的类

但是,行为可以通过类层次结构以外的方式进行控制

一种选择是结合接口使用:

interface MyInterface {
    public void someMethod();
}
class A implements MyInterface {
    public void someMethod() {
        // do something
    }
}
class B extends A {
    public void someMethod() {
        // do something different
    }
}

class C implements MyInterface {
    private final MyIntegerface delegate;
    public C(MyIntegerface delegate) {
        this.delegate = delegate;
    }
    public void someMethod() {
        delegate.someMethod(); 
    }
}
构造C对象的客户端将客户端希望C使用的委托传递给它:

C x = new C(new A());
C y = new C(new B());
C类只有一个定义,但它有多种行为方式。

我猜:

abstract class Ball {

< some common functionality >

}
抽象类球{
<一些常见功能>
}
现在沙滩球是一个具体的类,它是一个特定的球。所以你现在应该把它作为一个独立的类

:

   class BeachBall extends Ball {

   < some common functionality inherited from Ball >
   <additional functionality>

   }
:
类沙滩球{
<从Ball继承的一些常见功能>
}
其他类如C、D、E也是混凝土类,并假设它是另一种类型的球,因此:

   class C extends Ball {

   < some common functionality inherited from C >
   <additional C funcionality>

   }

   <other classes are ommited>
C类扩展球{
<从C继承的一些常见功能>
}
或者,如果您的C、E、D类是更具体的沙滩球类型,可以这样做:

  class C extends BeachBall {

   < some common functionality inherited from BeachBall & Ball >
   <additional C funcionality>

   }

   <other classes are ommited>
C级扩展沙滩球{
<从BeachBall&Ball继承的一些常见功能>
}

N.B
意味着这同样适用于E,D和C。

直接扩展B类,它将自动扩展A类。因为B类是A类的子类,C,D,E是否所有三个现在都扩展A?是的,如果措辞不明确,很抱歉,C,D,E都扩展A,我需要它能够扩展A而不扩展B(A+C、A+D、A+E的特性)。我还希望C、D、E也能够扩展B(所以,特性A+B+C、A+B+D、A+B+E),也许我的方法不对。假设C、D和E都向A添加了一个特性,我希望它能够扩展其子类,就我所知,java有一个单一的层次结构。是的,但是你不能创建A的项(不是B)包含自我特征(C、D或E)亲爱的@arcyqwerty,你已经改变了你的问题。在你的问题中,查询和示例是矛盾的。你给出的示例可以用Java实现,方法是创建接口C、D和E,并在A和B上实现它们,因为你想在EndInterface上创建A和B的对象,但接口不能实现对吗?所以对于每个如果我要实现它,我必须复制实现(因为它不是继承的)?是的,很抱歉更改了这个问题。我不认为我很清楚我最初说的和我正在寻找的。除此之外,如果你想创建你在问题中引用的表示,而不是使用继承,你可以在A和B中有C、D和E类的对象,或者你可以有A和B类的对象在类C、D和E中,取决于您想要初始化为对象的对象首先,类C、D和E是提供功能的类,因此它们应该是基类而不是您实例化的类。您将实例化的类是a和B球和沙滩球。我正在根据您的需要编辑答案,请检查很好!但是,如果
B
也有一个
public void someOtherMethod()
,它还能被
y
使用吗?这就是想法。如果您不想使用它,请传入一个ASo实例,我如何指定
public void someOtherMethod()
C
的实例上可用,当从
B
构造时?它是否在接口中指定?(但是
a
需要实现/存根它?)C或者(始终)具有
其他方法()
or not-在任何情况下都是如此。这是类定义的本质。如果您想要的是动态类,java不是适合您的语言。
  class C extends BeachBall {

   < some common functionality inherited from BeachBall & Ball >
   <additional C funcionality>

   }

   <other classes are ommited>