[英]Return type of method that implements an interface
我很想知道處理實現接口的返回類型方法的最佳實踐/ 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。 但是,即使使用@Override標志,將其更改為TreeNode也不會導致任何錯誤或警告。
從Java 5開始,重寫的方法可以返回超類中提到的返回類型的接口/類的任何子類。 除非特別要求,否則我將堅持返回接口(這主要發生在重構客戶端已經在使用特定實現類的舊代碼時,而我們現在正在重構它以形成類層次結構)。
那么,你提到的已經稱為協變返回,它在jdk 1.5之前不存在。 Covariant返回概念已添加到Java語言中以支持Java Generics。 有關更多信息,請訪問http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
我更喜歡TreeNode作為TreeNode類的返回類型。
您需要決定TreeNode對象應該做什么。 如果其節點除了實現ITreeNode的TreeNode之外還可以包含其他內容,那么不僅返回類型需要是ITreeNode,而且實例成員也需要是ITreeNode。 否則,如果它的TreeNodes一直向下,那么我不清楚你為什么要打擾一個界面。
根據我的說法,返回類型應該是Interface Type.Reason的類型,以便您以后可以更改底層實現
1 Example> ITreeNode node = new Tree1(); // First Underlying Implementation
2 Example> ITreeNode node1 = new Tree2(); // Second Underlying Implementation
我想,如果我錯了,請糾正我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.