2016-09-05 1 views
0

image У нас есть класс с именем RotationClass, который вращает объекты GeoObjects (треугольник, круг, линия).Лучшая практика для проверки, если объект может обрабатываться

В классе у нас есть 3 Методы:

RotateTriangle() 
RotateCircle() 
RotateLine() 

....

поэтому кто-то дает список геообъектов в мой класс, и все они повернется с их specifit Rotate-метод ,

Но теперь ... есть новый GeoObject Rectangle ..... Как я могу реализовать Methode как «CanRotateGeoObjectList»? Метод должен проверить, существует ли метод Rotate для каждого объекта GeoObject.

Надеюсь, вы понимаете

[EDIT: Добавить информацию] Я не могу изменить/не имеют доступа к GeoObject - Код

+0

Обновите свой вопрос, добавив невероятно важную информацию, которую вы не можете изменить исходный код для реализаций GeoObject. В противном случае каждый ответ на ваш вопрос подскажет вам изменить эти реализации. –

ответ

1

Вы делаете это с помощью соответствующих идей дизайна OO; и первое, что там: вы должны никогда никогда попасть в бизнес по созданию методов, как doSomethingForClassA(), doSomethingForClassB(), ...

Наивный способ может быть, чтобы сделать ваш класс GeoObject реферата; и добавить абстрактный метод rotate(); и boolean-возвращающий поддерживает Rotation().

Ваши подклассы должны были бы реализовать эти два метода правильным образом. Предостережение с этим решением: в зависимости от вашего «моделирования» GeoObject, возможно, должно быть не знать о «поворотах» - идея наличия специального класса вращения имеет определенные достоинства; особенно если учесть, что может быть много других преобразований, которые можно применить к объекту GeoObject.

Одним из способов решения таких ситуаций может быть visitor pattern.

Редактировать: с учетом вашего комментария Мне интересно, можете ли вы создать свою собственную оболочку вокруг GeoObject. Может быть, даже что-то простое, например,

public class GeoObjectWrapper { 
    private final GeoObject wrappedObject; 
    public GeoObjectWrapper(GeoObject wrappedObject) { 
    this.wrappedObject = wrappedObject); 
    } 

public Object getWrapped() { return wrappedObject; } 

, чтобы затем внедрить эти новые методы в класс обертки.

Но да, чтобы придумать решение, которое не делает такие уродливые вещи, как rotatateTriangle() ... вам, вероятно, нужны механизмы отражения на вашем языке программирования.

+0

Будет ли использование GeoObject интерфейса поворота жизнеспособным вариантом? – c0der

+0

Хорошо, это было бы моим решением ... но у меня нет доступа к GeoObjects! Это очень большая программа, и я должен добавить этот модуль ....Да, мы знаем, что это не «хорошее» решение, но я не могу получить доступ к объектам. Поэтому, чтобы знать, что мой класс работает, но проблема все еще существует ---> если есть список с объектом, я не знаю, что не узнаю этого. – AnonymGuest

0

Если вы не можете изменить реализацию GeoObject, вы можете использовать отражение, чтобы получить метод в экземпляре. Это не чистое решение, но оно может решить его, если ваш язык программирования поддерживает рефлексию.

Смежные вопросы