2012-03-11 6 views
0

У меня есть класс под названием Document, который может быть продлен на Page или Image. Для каждого из них у меня есть метод insert в базе данных. Вставка для Page и Image включает в себя вставку для Document.Это пример использования instanceof?

Мои сомнений, если способ, чтобы определить, какой метод будет называться это проверка класса первым, как это:

if (doc instanceof Document){ 
    insertDoc(doc); 
} 
if (doc instanceof Page){ 
    insertPage(doc); 
} 
if (doc instanceof Image){ 
    insertImage(doc); 
} 

Или есть другой способ, потому что я всегда слышал, что использование instanceof не является хорошим вещь.

Редактировать: Полиморфизм в этом случае не работает, не так ли? Что-то вроде insert(Document doc), insert(Page doc) и insert(Image doc).

ответ

8

Я думаю, что было бы лучше реализовать метод insert в классе Document и переопределить его соответствующими методами в классах, которые его расширяют. Затем просто позвоните doc.insert();.

+0

Я понимаю ваше решение, но я не знаю, является ли это лучшим вариантом, потому что я разделяю все слои (просмотр, TO, данные, ядро ​​и т. Д.). Если я использую этот путь, это нарушит эту организацию, но это будет работать. Спасибо. –

4

В случае, если в будущем вы планируете добавить больше типов, расширяющих документ, и добавьте больше операций, чем просто insert(), я бы предложил реализовать шаблон дизайна Visitor. В противном случае, следуйте предложению Bynyamin Sharet.

+0

Я изучу это решение более глубоко и посмотрю, есть ли лучший выбор. Спасибо. –

+0

Я думаю, что этот подход является более правильным с архитектурной точки зрения. Удачи! ;) – aviad

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