Как изменить параметр от унаследованного класса, который реализует интерфейс? - PullRequest
0 голосов
/ 31 марта 2012

У меня есть интерфейс и класс, реализующий интерфейс, подобный следующему:

public interface DocumentDAO<T>{
    public long insert (T doc);
}

public class PostgreSQLDocumentDAO implements DocumentDAO<Document>{
    public long insert(Document doc){}
    protected void insertDocument(Document doc){}
}

Я хочу переопределить метод insert для PostgreSQLDocumentDAO, изменив параметр с Document до Страница , где Страница - это класс, который расширяет Документ .

Я хочу что-то вроде этого:

public class PostgreSQLPageDAO extends PostgreSQLDocumentDAO{
    public long insert(Page doc){
        super.insertDocument(page);
        //specific implementation goes here
    }
}

Как мне это получить?


ОБНОВЛЕНИЕ: Приведенный выше код неверен, потому что класс с именем Inserter использует интерфейс DocumentDAO.Когда он вызывает метод insert , даже если это объект PostgreSQLPageDAO , он вызывает метод insert для вставки Document , поскольку этот метод наследуется.

Я хочу сделать так, чтобы когда класс Inserter вызывал метод insert , он использовал метод, который вставляет page .Таким образом, я думаю, что мне нужно переопределить insert (Document doc) с PostgreSQLDocumentDAO.

Ответы [ 2 ]

3 голосов
/ 31 марта 2012

Здесь доступны два варианта.

  1. Вы можете изменить PostgreSQLDocumentDAO

Затем измените его на

public class PostgreSQLDocumentDAO<D extends Document> implements DocumentDAO<D>

и

public class PostgreSQLPageDAO extends PostgreSQLDocumentDAO<Page>

2.Вы не можете изменить PostgreSQLDocumentDAO

Затем необходимо перегрузить и переопределить метод вставки в PostgreSQLPageDAO с помощью:

// Override
@Override
public long insert(Document doc){
    if (!(doc instanceof Page))
         throw new IlegalArgumentException("insert only accepts Page");
    super.insert(doc);
}

// Overload
public long insert(Page page){
    super.insert(page);
}
0 голосов
/ 31 марта 2012

Я не вижу проблемы.
Поскольку Page является производным от Document, вы можете просто передать Page вместо Document.

Если вам нужна специальная обработка в методе производного класса, вы можете проверить, является ли Document instanceof Page, и делать то, что вам нужно.

Конечно, предполагается, что вы не можете изменить интерфейсы / классы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...