0

我有以下我想要通用的学习课程:

public abstract class Study<
    T1 extends Context, 
    T2 extends Region,
    T3 extends Domain<T2>, 
    T4 extends Solution> {...

派生类的示例如下:

public class AmericanCultureStudy<
    T1 extends AmericanCultureContext, 
    T2 extends AmericanCultureRegion,
    T3 extends AmericanCultureDomain<T2>, 
    T4 extends AmericanCultureSolution>
extends Study<T1, T2, T3, T4> {...

public class ContemporaryAmericanCultureStudy<
    T1 extends ContemporaryAmericanCultureContext, 
    T2 extends ContemporaryAmericanCultureRegion,
    T3 extends ContemporaryAmericanCultureDomain<T2>, 
    T4 extends ContemporaryAmericanCultureSolution>
extends AmericanCultureStudy<T1, T2, T3, T4> {...

public class ContemporaryMainstreamAmericanCultureStudy<
    T1 extends ContemporaryMainstreamAmericanCultureContext, 
    T2 extends ContemporaryMainstreamAmericanCultureRegion,
    T3 extends ContemporaryMainstreamAmericanCultureDomain<T2>, 
    T4 extends ContemporaryMainstreamAmericanCultureSolution>
extends ContemporaryAmericanCultureSolution<T1, T2, T3, T4> {...

这种设计的结果是主代码中类的实例化变得繁重,如下所示:

ContemporaryMainstreamAmericanCultureStudy<
    ContemporaryMainstreamAmericanCultureContext, 
    ContemporaryMainstreamAmericanCultureRegion,
    ContemporaryMainstreamAmericanCultureDomain<
        ContemporaryMainstreamAmericanCultureRegion>,
        ContemporaryMainstreamAmericanCultureSolution> 
    study = new ContemporaryMainstreamAmericanCultureStudy<
        ContemporaryMainstreamAmericanCultureContext,
        ContemporaryMainstreamAmericanCultureRegion,
        ContemporaryMainstreamAmericanCultureDomain<
            ContemporaryMainstreamAmericanCultureRegion>,
        ContemporaryMainstreamAmericanCultureSolution>() ;

尽管不同,但包含的所有类Study都是相同的关注类型,因此必须有一种方法通过减少Study.

任何人都可以帮助解决这个问题吗?谢谢

4

2 回答 2

2

在这种情况下,泛型实际上是必要的吗?例如,是否有可能只在您的构造函数中接收一组从ContextRegionDomain和派生的类的对象Solution?如果这是可能的,那绝对是正确的方法。

如果这是不可能的,您至少可以通过创建一个中间Culture类来隐藏一些沉重:

class Culture<
    C extends Context, 
    R extends Region,
    D extends Domain<R>, 
    S extends Solution> {
  ...
}

你需要一个凌乱的声明,比如说,,ContemporaryAmericanCulture但是你的Study实例化可能是Study<ContemporaryAmericanCulture> study = new Study<ContemporaryAmericanCulture>().

于 2013-03-23T13:55:40.467 回答
1

在某些时候,动态地做一些事情是值得的,比如将如下所示的外部表存储在文件或数据库中:

|ID    | Context | Region | Domain | Solution |  
|123   | Abc     | Def    | Ghi    | Jkl      |  
...

然后,您可以为这些实体定义操作/数据,例如打印时要使用的字体、应该重定向的页面、允许多少学生参加学习等等。

你的对象看起来像

   class Study {
       int id;
       String context;
       String region;
       String domain;
       String solution;
   }

类型安全性很好,但如果您想管理许多和/或不可预见数量的实体,那么您不应该以每次添加/更改/删除实体时都需要触摸代码的方式进行编码。

于 2013-03-23T14:12:46.533 回答