2009-05-04 91 views
2

比方说,我有一个叫做“形状”的抽象父类,并且有多个子类(三角形,方形,圆形......)。我想在所有子类必须实现的父“形状”类中定义一个抽象方法,我们称它为“draw”。所以所有形状子类都必须提供“draw()”方法。但是,绘制方法需要“Stencil”类型的参数,并非每个形状子类都可以使用任何模板...是否有可能在重写的方法中有专门的参数?

所以有一个抽象“形状”类,多个形状子类和多个模具。我需要在形状类中定义的绘制方法。一个正方形可能使用Stencil1,而该圆形可能使用Stencil2。

我猜泛型会做伎俩,但我不确定。每个形状子类都需要定义具有特定模板的绘制方法,因为这些类也被其他类使用,并且编译器应该强制所有程序员使用该类支持的模板调用绘制方法。我们无法定义像“public abstract void draw(Stencil s)”这样的抽象方法,因为程序员可以将任何模具传递给方形类,而方形类仅支持“Stencil1”

任何想法?

UPDATE1: 要补充一点,形状类不关心哪个模板被使用的子类,但是由于子类在其他班级太习惯,这一点很重要的是牵引方法被定义使得只有支持的模板被编译器接受。

+0

除了形状类不关心,因为当你说:“编译器应该强制所有程序员调用与由该类支持模板抽签方法” – cgp 2009-05-04 15:19:26

+0

没有,形状类不关心;这是关心各种Shape类别的其他用途。 – user85116 2009-05-05 00:16:33

回答

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(); 
    } 
} 
0

如果你想这在编译时被捕获,下列选项浮现在脑海中:

  • 创建一组抽象的模版。特别是如果你认为你可以将他们分组。所以如果你有多个“方形”模板,创建一个SquareStencil抽象类型并从中派生出具体的实例。您甚至可以将它们创建为抽象Stencils类的子集。
  • 重载绘制方法。不需要它是通用的。让编译器通过为作业选择正确的方法来帮助你。
+0

如果我超载,那会让问题变得更糟,不是吗?我不想要多个版本的绘制;我想要一个只接受该类的正确模版的版本。 – user85116 2009-05-04 14:52:14

1

我认为你应该重新考虑你的初始设计。

当然,你可以通过使用instanceof等来解决这个问题。但是,这会导致一个非常令人困惑的API(如果这就是你使用它的原因)。

+0

我敢肯定,设计听起来令人困惑,从我的描述,但它不是真的那么糟糕 – user85116 2009-05-04 14:51:16

0

定义一个abstact模板,并让子类的构造函数决定使用哪个stencil类。

private Stencil s; 

public void draw(){ 
    privateDraw(s) 
} 

private abstract void privateDraw(Stencil s); 
相关问题