簡體   English   中英

返回實現接口的方法類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM