Можно ли использовать оператор instanceof для реализации двух параллельных иерархий функций и аргументов для них?

Является ли использование оператора instanceof плохой практикой в ​​следующем контексте?

public interface IWriter {
    public abstract void write(Dto dto);
}

public abstract class Dto {
    private long id;
    public void setId(long id) {this.id = id;}
    public long getId() {return id;}
}

public class DtoA extends Dto {
   ...
}

public class DtoB extends Dto {
   ...
}

public class MyWriterA implements IWriter {
   @Override
   public void writer(Dto dto) {
     if (!(dto instanceof DtoA))
        return;
     ...
   }
}

public class MyWriterB implements IWriter {
   @Override
   public void writer(Dto dto) {
     if (!(dto instanceof DtoB))
        return;
     ...
   }
}

Существует множество мифов об использовании этого оператора, и я не совсем уверен, что то, что я делаю, не чушь.

У меня есть много разных реализаций писателя которые я хочу объединить в одном интерфейсе. Проблема в том, что не каждый DTO применим для каждого писателя. В моем фактическом коде есть глубокая иерархия DTO, которые расширяют DtoA и DtoB, и либо ветвь иерархии DtoA или DtoB применима для писателя, но только в некоторых случаях и то и другое.

Следует ли мне избегать использования абстрактного класса Dto в качестве аргумента для абстрактного метода write (Dto dto) ?

РЕДАКТИРОВАТЬ: Прочтите комментарии к принятому ответу.

5
задан Paŭlo Ebermann 27 August 2011 в 17:07
поделиться