2017-04-16 7 views
5

Pracuję nad symulacją fizyki.Porada dotycząca projektu między zajęciami dla rodziców i dzieci?

Mam ArrayList który przechowuje wszystkie obiekty w mojej symulacji. Mam klasę nadrzędną: Shape i dwie klasy dla dzieci: Circle i Rectangle.

klasy nadrzędnej, oczywiście, nie ma metody draw() ale każda z klas potomnych robi. Dlatego też, kiedy jestem zapętlenie koryta listy wyciągnąć każdy element, to nie pozwala mi, bo nie ma draw() metoda w klasie Shape (jak ja definiowania listy jako ArrayList<Shape> i dodanie każdego nowego elementu z instancja klasy potomnej).

Czy istnieje sposób, aby rozwiązać ten problem w dobrym i czystym sposób?

+2

Potrzebujesz metody "abstrakcyjnej". – SLaks

+0

próbowałem zdefiniować klasę jako abstrakcyjne kształty, a następnie dodać metody abstrakcyjne remisu, ale nadal nie działa @SLaks – Robot0110

+0

jeśli naprawdę tworząc obiekt okrąg w ArrayList to będzie działać dobrze – abcOfJavaAndCPP

Odpowiedz

4

Najłatwiejszym krokiem do przodu jest użycie interfejsów.

public interface Shape { 
    void draw(); 
} 

public class Rectangle implements Shape { 
    @Override 
    public void draw() { // draw rect } 
} 

public class Circle implements Shape { 
    @Override 
    public void draw() { // draw circle } 
} 

Jeśli chcesz Kształt podzielić jakąś inną logikę z jego dzieci można utworzyć kształt wykonawczy klasy AbstractShape z jakiegokolwiek dodatkowego kodu i przedłużyć klas potomnych użyciu tej klasy abstrakcyjnej.

+2

Ponieważ ten interfejs deklaruje tylko metodę 'draw()', nazwałbym interfejs 'Drawable', zamiast' Shape'. – AJNeufeld

+0

@AJNeufeld tak, byłoby lepiej. Konwencjonalne interfejsy powinny być nazwami po przymiotnikach. – abhipil

4

wydaje się zapewniać abstrakcyjną metodę klasy Shape gdzie wszystkie podklasy mają wspólny zachowanie jest najlepsze dla danego zadania.

Rozważ to jest klasa Shape:

public abstract class Shapes{ 
    public abstract void Draw(); 
} 

klasa Rectangle:

public class Rectangle extends Shapes{ 
    public void Draw(){ 
     System.out.println("Rectangle"); 
    } 
} 

klasa Circle:

public class Circle extends Shapes{ 
    public void Draw(){ 
     System.out.println("Circle"); 
    } 
} 

teraz uznając, że zarówno Circle i Rectangle są typu Shape, można tworzyć obiekty typu Circle lub/i Rectangle, dodaj je do ArrayList, iteracyjne nad nim, i wywołać metodę Draw() na każdy obiekt tak:

ArrayList<Shapes> shapes = new ArrayList<>(); 
shapes.add(new Circle()); 
shapes.add(new Rectangle()); 
shapes.forEach(Shapes::Draw); 

wynik gdy Draw() metoda jest wywoływana na każdy obiekt:

Circle 
Rectangle 
0

Tak to zrobię.

klasy o nazwie Kształty, które ma pole do listy < Shape> Kształt jest interfejsem trzyma draw() metoda GetArea() lub jakichkolwiek innych. Mają tyle klas implementujących Kształt, kółko, prostokąt, kwadrat itp.

Powiązane problemy