我有以下我想成为普通学生的学习课程:
public abstract class Study<
T1 extends Context,
T2 extends Region,
T3 extends Domain,
T4 extends Solution> {...
派生类的示例如下:
public class AmericanCultureStudy<
T1 extends AmericanCultureContext,
T2 extends AmericanCultureRegion,
T3 extends AmericanCultureDomain,
T4 extends AmericanCultureSolution>
extends Study {...
public class ContemporaryAmericanCultureStudy<
T1 extends ContemporaryAmericanCultureContext,
T2 extends ContemporaryAmericanCultureRegion,
T3 extends ContemporaryAmericanCultureDomain,
T4 extends ContemporaryAmericanCultureSolution>
extends AmericanCultureStudy {...
public class ContemporaryMainstreamAmericanCultureStudy<
T1 extends ContemporaryMainstreamAmericanCultureContext,
T2 extends ContemporaryMainstreamAmericanCultureRegion,
T3 extends ContemporaryMainstreamAmericanCultureDomain,
T4 extends ContemporaryMainstreamAmericanCultureSolution>
extends ContemporaryAmericanCultureSolution {...
这种设计的结果是,类在主代码中的实例化变得很重,如下所示:
ContemporaryMainstreamAmericanCultureStudy<
ContemporaryMainstreamAmericanCultureContext,
ContemporaryMainstreamAmericanCultureRegion,
ContemporaryMainstreamAmericanCultureDomain<
ContemporaryMainstreamAmericanCultureRegion>,
ContemporaryMainstreamAmericanCultureSolution>
study = new ContemporaryMainstreamAmericanCultureStudy<
ContemporaryMainstreamAmericanCultureContext,
ContemporaryMainstreamAmericanCultureRegion,
ContemporaryMainstreamAmericanCultureDomain<
ContemporaryMainstreamAmericanCultureRegion>,
ContemporaryMainstreamAmericanCultureSolution>() ;
Study中包含的所有类虽然不同,但都属于同一关注类型,因此必须有一种方法通过减少Study发布的类型数量来简化这一点。
有人能帮忙吗?谢谢
不可读…
尝试使用较短的类名、命名空间包…
你需要仿制药吗?你不能在不知道具体实现的情况下使用interface或superclass吗?
没有足够的信息来理解您试图解决的问题,但是根据类名判断,您可能会混淆继承和组合。似乎Context和Region是Study的属性。请参阅stackoverflow.com/questions/11031843/inheritance vs composit&zwnj;&8203;ion
它看起来像是通过子类型和泛型"多态"整个对象图。当某些事情需要改变时,您可能会遇到可维护性的噩梦。但从类签名来看,很难猜测实际的设计可能是什么。
在这种情况下,仿制药真的是必要的吗?例如,是否可能只接受一组从Context、Region、Domain和Solution派生的类对象?如果可能的话,这绝对是正确的选择。
如果这是不可能的,那么您至少可以通过创建一个中间的Culture类来隐藏一些沉重感:
class Culture<
C extends Context,
R extends Region,
D extends Domain,
S extends Solution> {
...
}
你需要一个杂乱无章的声明,比如说,ContemporaryAmericanCulture,但是你的Study实例化可以是Studystudy = new Study()。
在某种程度上,动态地做一些事情是值得的,比如在文件或数据库中存储下面这样的外部表:
|ID | Context | Region | Domain | Solution |
|123 | Abc | Def | Ghi | Jkl |
...
然后,您可以为这些实体定义操作/数据,例如打印内容时要使用的字体、应该重定向的页面、允许多少学生参与学习等。
你的物品看起来像
class Study {
int id;
String context;
String region;
String domain;
String solution;
}
类型安全性很好,但是如果您想要管理许多和/或不可预见的实体,那么您不应该以这样的方式编码,即每次添加/更改/删除实体时都需要触摸代码。