对 类 的两个依赖层次结构建模

Modelling two dependent hierarchies of classes

我正面临一个建模问题,我试图在此 post 中尽可能简化它。

我考虑一组 classes,它们扩展了一个共同的 class(这里称为 Letter):

public abstract class Letter{
    public void commonMethod(){...}
}

public class A extends Letter{
    public void methodA(){...}
}

// Idem for several classes B, C, D, ...

我需要实施另一组 classes。它们每个都包含一个 Letter 属性并扩展相同的 class(此处称为 UsesLetter)。

这是我目前的做法(但我想知道是否有更好的方法):

public abstract class UsesLetter{
    protected Letter l;

    public UsesLetter(Letter l){this.l = l;}
    public void commonMethod(){l.commonMethod();}
    public abstract void setLetterIfCompatible(Letter l);
}

public class UsesA extends UsesLetter{

    public UsesA(A a){super(l);}

    public void usesA(){((A)l).methodA();}

    @Override
    public boolean setLetterIfCompatible(Letter l){

        boolean result = false;
        if(l instanceof A){
            this.l = l;
        result = true;

        return result;

    }

    // Specific behavior of the class
    // ...

}

// Idem for several classes UsesA, UsesB, ...
// Note: several classes may use the same Letter class (e.g., UsesABis, UsesATer, ...)

// Example of use
public static void main(String[] args){

    UsesA ua = new UsesA(new A());
    UsesB ub = new UsesB(new B());

    // I want to be able to use the common and specific methods...
    ua.commonMethod();
    ua.usesA();
    ub.usesB();

    Letter l = new A();

    // ... and to change the letter
    if(ua.setLetterIfCompatible(l))
        ua.methodA();

}

我不相信这是实现我想要的行为的最佳方式,因为每次我想使用它们时都需要转换字母。

不知道有没有更好的建模?也许是设计模式?

您可以使用泛型:

public abstract class UsesLetter<LetterType extends Letter>{
    protected LetterType l;

    public UsesLetter(LetterType l){this.l = l;}
    public void commonMethod(){l.commonMethod();}
    public abstract void setLetter(LetterType l);
}

public class UsesA extends UsesLetter<A>{

    public UsesA(A a){super(a);}

    public void useA(){((A)l).methodA();}

    @Override
    public void setLetter(A a){
        l = a;
    }

    // Specific behavior of the class
    // ...
}