2011-02-07 2 views
3

Мне любопытно узнать, что является лучшей практикой/конвенцией SE для обработки возвращаемого типа методов, реализующих интерфейс. В частности, предположим, что мы реализуем простое дерево, с интерфейсом, например:Возвращаемый тип метода, который реализует интерфейс

public interface ITreeNode { 
    public ITreeNode getLeftChild(); 
    public ITreeNode getRightChild(); 
    public ITreeNode getParent(); 
} 

И у нас есть класс, который реализует TreeNode что:

public class TreeNode implements ITreeNode { 
    private TreeNode LeftChild, RightChild, Parent; 
    @Override 
    public ITreeNode getLeftChild() { 
     return this.LeftChild; 
    } 

    @Override 
    public ITreeNode getRightChild() { 
     return this.RightChild; 
    } 

    @Override 
    public ITreeNode getParent() { 
     return this.Parent; 
    } 
} 

Мой вопрос .. должен тип возвращаемого значения соответствующими внедренными методами являются ITreeNode или TreeNode и почему.

Eclipse автоматически заполняет методы TreeNode возвращаемым типом ITreeNode. Однако изменение его в TreeNode не вызывает никаких ошибок или предупреждений даже с флагом @Override.

ответ

3

Начиная с Java 5 переопределенные методы могут возвращать любой подкласс интерфейса/класса возвращаемого типа, упомянутого в суперклассе. Я буду настаивать на возврате интерфейса, если это специально не требуется (это происходит главным образом при рефакторинге старого кода, в котором клиент уже использовал определенный класс реализации, в то время как мы сейчас реорганизуем его для формирования иерархии классов).

0

По мне, тип возвращаемого значения должен быть таким интерфейсом Type.Reason, так что вы можете изменить базовую реализацию позже

1 Example> ITreeNode node = new Tree1(); // First Underlying Implementation  
2 Example> ITreeNode node1 = new Tree2(); // Second Underlying Implementation  

Я думаю, пожалуйста, поправьте меня, если им неправильно.

2

Хорошо, то, что вы упомянули, называется ковариантным возвратом, оно не существовало до jdk 1.5. Концепции возврата ковариации были добавлены в язык Java для поддержки Java Generics. Для получения дополнительной информации, http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Я бы предпочел TreeNode в качестве возвращаемого типа в классе TreeNode.

2

Вам нужно решить, что должен сделать ваш объект TreeNode. Если его узлы могут содержать другие вещи помимо TreeNodes, которые реализуют ITreeNode, то не только типы возвращаемых данных должны быть ITreeNode, но и членам экземпляра также должен быть ITreeNode. В противном случае, если это TreeNodes полностью вниз, то мне непонятно, почему вы беспокоитесь об интерфейсе.

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