在Java中,减少扩展数量以使类尽可能少的最佳方法是什么?

在Java中,减少扩展数量以使类尽可能少的最佳方法是什么?,java,extends,class-diagram,Java,Extends,Class Diagram,简而言之,我需要一个类License,它需要扩展成两个子类,我们称它们为a和B 许可证: 公共抽象类许可证{ } A: 公共A类扩展许可证{ 有效日期; 到期日; } B: 公共B级扩展许可证{ } 但根据用户的年龄(儿童、年轻人、成年人、老年人),这两种类型也可能不同。我会使用枚举,但对于孩子来说,需要有导师(User)才能获得许可证。 所以我看到的唯一可能的方法是对每种类型都扩展4 我不想要的示例: //扩展 公共类AChild扩展了{ 用户导师; } 公共类Ayongadult扩展了

简而言之,我需要一个类
License
,它需要扩展成两个子类,我们称它们为
a
B

许可证:

公共抽象类许可证{
}
A:

公共A类扩展许可证{
有效日期;
到期日;
}
B:

公共B级扩展许可证{
}
但根据
用户的年龄(儿童、年轻人、成年人、老年人),这两种类型也可能不同。我会使用枚举,但对于孩子来说,需要有导师(
User
)才能获得许可证。 所以我看到的唯一可能的方法是对每种类型都扩展4

我不想要的示例:

//扩展
公共类AChild扩展了{
用户导师;
}
公共类Ayongadult扩展了{
}
公共类AAdult扩展了{
}
公共类asenor扩展了{
}
//B的延伸
公共类B扩展B{
用户导师;
}
公共类BYoungAdult扩展了B{
}
公共类BAdult扩展到B{
}
公共类BSenior扩展了B{
}
问题并不是很大,我只是想要一个更干净的方法
如果比较容易的话,你可以用代码或类图来解释。

好的,我找到了一个解决方案。 因此,首先我将用户扩展到所有年龄类别,然后我为
青年人
成人
老年人
命名为
可替代的

公共接口可替换{
}
实现可替换的示例

公共类成人扩展用户实现可替换{
}
在许可证中,我做了两个构造器。一个仅用于
用户可替代
,另一个用于
子级
可替代
,如下所示:

公共抽象类许可证{
公共许可证(可替代用户){
}
公共许可证(子用户、可替代导师){
}
}
如果你有更好的主意,让我知道,我很乐意听到!
否则,非常感谢

继承: 当我们想要创建一个新类,并且已经有一个类包含了我们想要的一些代码时,我们可以从现有类派生我们的新类。通过这样做,我们可以重用现有类的字段和方法

作文 组合还提供了代码重用性,但这里的区别是我们没有为此扩展类

遗产 作文 我们定义要继承的类(超级类),最重要的是,它不能在运行时更改 我们只定义一个我们想要使用的类型,它可以保存它的不同实现,也可以在运行时更改。因此,组合比继承灵活得多。 我们只能扩展一个类,换句话说,不能扩展多个类,因为java不支持多重继承。 它允许使用不同类的功能。 继承不能扩展最终类。 组合允许代码重用,即使是来自最终类。 这是一种非此即彼的关系。 这是一种“有-有”的关系。
Java 8+支持接口中的
default
方法。 这可以补充您的界面解决方案,如下所示:

public interface LicenseBearer {

    default LicenseBearer getResponsiblePerson() { return this; }

}
这将始终返回实现LicenseBearner接口的类,除非
@重写该方法,例如用于实现
子类。此外,
许可证
类将不再关心提供的
子类
是否有
导师
。因此,您可以将儿童-导师关系的责任移出
许可证
类”域

然后,您将拥有一个
抽象类Person implements licensebear
,如果需要,您可以从中派生出其他Person类,其中只有
子类
具有与
许可证
相关的特殊行为:

public class Child extends Person {

    Person tutor;

    private Child() { /* No Child without a tutor Person allowed */ }

    public Child(Person tutor) {
        this.tutor = tutor;
    }

    @Override
    public LicenseBearer getResponsiblePerson() {
        return this.tutor;
    }
}

许可证
类的目的是什么?驾驶执照?您可以将
Age
抽象为一个组合类,表示您想要恢复的功能这是一个“covidfree”过程,如果你有一个新冠病毒阴性测试,它是暂时有效的,如果你接种了两种疫苗,你的许可证就不会过期。是的,我想到了,但这会让我创建空类,如果我能避免,那就太好了。@KidusTekeste,还不太清楚,你提出了一个变量加上两个extends for child?到目前为止@Rogue拥有最干净的解决方案非常感谢!它不能完全解决我的问题,但足以让我继续下去!!这本可以是一个解决方案,但就像尼哈·贾哈的回答一样,他提议用一篇作文,我想我会同意的。谢谢你的回答!