在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拥有最干净的解决方案非常感谢!它不能完全解决我的问题,但足以让我继续下去!!这本可以是一个解决方案,但就像尼哈·贾哈的回答一样,他提议用一篇作文,我想我会同意的。谢谢你的回答!