Можно ли иметь специализированные параметры в переопределенных методах? - PullRequest
2 голосов
/ 04 мая 2009

Допустим, у меня есть абстрактный родительский класс, называемый "shape", и что существует несколько подклассов (треугольник, квадрат, круг ...). Я хочу определить абстрактный метод в родительском классе «shape», который должны реализовывать все подклассы, назовем его «draw». Таким образом, все подклассы фигур должны предоставлять метод draw (). Но метод draw принимает параметр типа «Stencil», и не каждый подкласс фигур может использовать только любой трафарет ...

Таким образом, существует один абстрактный класс "shape", несколько подклассов фигур и несколько трафаретов. Мне нужен метод рисования, определенный в классе формы. Квадрат может использовать Stencil1, а круг - Stencil2.

Я предполагаю, что дженерики справятся с задачей, но я не уверен. Каждый подкласс формы должен определять метод draw с определенным трафаретом, потому что эти классы также используются другими классами, и компилятор должен заставить всех программистов вызывать методы draw с трафаретом, который поддерживается этим классом. Мы не можем определить абстрактный метод, такой как «public abstract void draw (Stencil s)», потому что тогда программист может передать любой трафарет классу square, тогда как класс square поддерживает только «Stencil1»

Есть идеи?

Update1: Следует добавить, что классу фигуры не важно, какой трафарет используется подклассом, но поскольку подклассы используются и в других классах, важно, чтобы метод draw был определен так, чтобы компилятор принимал только поддерживаемый трафарет.

Ответы [ 4 ]

7 голосов
/ 04 мая 2009
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 голос
/ 04 мая 2009

Думаю, вам следует пересмотреть свой первоначальный дизайн.

Конечно, вы могли бы обойти это, используя instanceof и т. Д. Однако, это приведет к очень запутанному API (если вы его используете).

0 голосов
/ 04 мая 2009

Определите абсолютный трафарет и позвольте конструктору подкласса решить, какой класс трафарета использовать.

private Stencil s;

public void draw(){
   privateDraw(s)
}

private abstract void privateDraw(Stencil s);
0 голосов
/ 04 мая 2009

Если вы хотите, чтобы это было перехвачено во время компиляции, на ум приходят следующие опции:

  • Создайте набор абстрактных трафаретов. Особенно, если вы думаете, что можете их сгруппировать. Поэтому, если у вас будет несколько «квадратных» трафаретов, создайте абстрактный тип SquareStencil и извлеките из него конкретные экземпляры. Вы даже можете создать их как подмножество абстрактного класса Stencils.
  • Перегрузить метод рисования. Нет необходимости в том, чтобы оно было общим. Позвольте компилятору помочь вам, выбрав правильный метод для работы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...