假设我有一个名为“shape”的抽象父类,并且有多个子类(三角形,正方形,圆形......)。我想在父“shape”类中定义一个抽象方法,所有子类都必须实现,我们称之为“draw”。因此所有形状子类都必须提供“draw()”方法。但是,draw方法采用“Stencil”类型的参数,并不是每个形状子类都可以使用任何模板......
因此,有一个抽象的“形状”类,多个形状子类和多个模板。我需要在shape类中定义一个draw方法。正方形可能使用Stencil1,圆圈可能使用Stencil2。
我猜测泛型可以解决这个问题,但我不确定。每个形状子类都需要使用特定的模板定义draw方法,因为这些类也被其他类使用,编译器应强制所有程序员使用该类支持的模板调用draw方法。我们不能定义像“public abstract void draw(Stencil s)”这样的抽象方法,因为那时程序员可以将任何模板传递给方形类,而方形类只支持“Stencil1”
有什么想法吗?
UPDATE1: 应该补充说,shape类不关心子类使用哪个模板,但由于子类也在其他类中使用,因此定义draw方法以便编译器只接受支持的模板是很重要的。 / p>
答案 0 :(得分:7)
public abstract class Shape<S extends Stencil>
{
public abstract void draw( S stencil );
}
public class Square extends Shape<Stencil1>
{
public void draw( Stencil1 stencil )
{
stencil.letsdo();
stencil.some();
stencil.drawing();
}
}
public class Circle extends Shape<Stencil2>
{
public void draw( Stencil2 stencil )
{
stencil.some();
stencil.more();
stencil.drawing();
}
}
答案 1 :(得分:1)
我认为你应该重新考虑你的初步设计。
当然,你可以通过使用instanceof等来解决这个问题。但是,这将导致一个非常混乱的API(如果你正在使用它)。
答案 2 :(得分:0)
如果您希望在编译时捕获它,可以考虑以下选项:
答案 3 :(得分:0)
定义一个抽象的Stencil,让子类构造函数决定使用哪个模板类。
private Stencil s;
public void draw(){
privateDraw(s)
}
private abstract void privateDraw(Stencil s);