假设我有一个名为“shape”的抽象父类,并且有多个子类(三角形、正方形、圆形......)。我想在父“shape”类中定义一个所有子类都必须实现的抽象方法,我们称之为“draw”。因此所有形状子类都必须提供“draw()”方法。但是,绘制方法采用“Stencil”类型的参数,并且并非每个形状子类都可以使用任何模板......

因此,存在一个抽象“形状”类、多个形状子类和多个模板。我需要在形状类中定义一个绘制方法。正方形可能使用 Stencil1,圆形可能使用 Stencil2。

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

有任何想法吗?

更新1:应该补充的是,形状类并不关心子类使用哪个模板,但由于子类也在其他类中使用,因此定义绘制方法非常重要,以便编译器只接受支持的模板。

有帮助吗?

解决方案

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

其他提示

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

当然,你可以通过使用instanceof等来解决这个问题。但是,这将导致一个非常混乱的API(如果你正在使用它)。

如果您希望在编译时捕获此问题,请考虑以下选项:

  • 创建一组抽象模板。特别是如果您认为可以将它们分组。因此,如果您有多个“方形”模板,请创建一个 SquareStencil 抽象类型并从中派生具体实例。您甚至可以将它们创建为抽象 Stencils 类的子集。
  • 重载绘制方法。它没有必要是通用的。让编译器帮助您选择适合工作的正确方法。

定义一个抽象的Stencil,让子类构造函数决定使用哪个模板类。

private Stencil s;

public void draw(){
   privateDraw(s)
}

private abstract void privateDraw(Stencil s);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top