簡體   English   中英

是否可以在Java中使用擴展類的getter / setter

[英]Is it possible to use getters/setters of extended class in Java

我有以下內容

public abstract class MyData
{
      private String sID;
      public void setsID(String sID) {
        this.sID= sID;
    }
       public String getsID() {
        return sID;
    }
} 

這個基類正在被其他2個類擴展

public class DataTypeOne extends MyData
{
       private String sName;
       public void setsName(String sName) {
        this.sName= sName;
        }
           public String getsName() {
            return sName;
        }
}


public class DataTypeTwo extends MyData
{
       private String sSummary;
       public void setsSummary(String sSummary) {
        this.sSummary= sSummary;
        }
           public String getsSummary() {
            return sSummary;
        }
}

我正在按如下方式初始化這個類

MyData oDataOne = new DataTypeOne();
MyData oDataTwo = new DataTypeTwo();

原因是我有一個工廠方法,它會給我一個基於類型的類(一個或兩個)

使用oDataOne和oDataTwo,我可以從基類訪問getsID() ,但不能訪問相應類的getter和setter。

我怎樣才能訪問這些? 一世

您無法訪問不存在的方法。 你所承諾的Java編譯器就是oDataOneoDataTwoMyData對象。 由於MyData類沒有特定於實現的方法,因此您不能要求Java調用這些方法(因為它不認為它們存在)。

如果要訪問這些方法,則需要將對象轉換為實際具有正確方法的類,或者可以將抽象方法存根添加到基類,這將告訴Java這些方法實際存在。

類型轉換在短期內更容易編寫,但不太清楚,您可能會遇到更多麻煩:

((DataTypeOne) oDataOne).getsName();
((DataTypeTwo) oDataOne).getsSummary(); // Throws ClassCastException!

添加抽象存根更加健壯,但如果並非所有具體子類都應實現所有抽象方法,則可能沒有意義:

public abstract class MyData {
    public abstract void setsName(String name);
    public abstract String getsName();
    public abstract void setsSummary(String summary);
    public abstract String getsSummary();
}
public class DataTypeOne extends MyData {
    public String getsName() {
        // implement
    }
    public void setsName(String name) {
        // implement
    }

    // Still have to implement these!!!
    public String getsSummary() {
        // raise an exception or something if appropriate
    }
    public void setsSummary(String summary) {
        // raise an exception or something if appropriate
    }
}
// Same for DataTypeTwo

由於您將變量聲明為MyData,因此您只能訪問MyData的方法。 您可以通過將子類方法強制轉換為DataTypeOne或DataTypeTwo來獲取子類方法:

 ((DataTypeOne)oDataOne).getsName()

但是您需要確保它是DataTypeOne類型,否則您將獲得ClassCastException

MyData oDataOne = new DataTypeOne();

這就是說,你的oDataOne對象屬於MyData類型。 即使它是作為DataTypeOne創建的,java也只能確定它是一個MyData實例。

如果您確定MyData實例實際上也是DataTypeOne實例,則可以轉換然后訪問DataTypeOne方法+ MyData方法。

要確保對象是特定類型測試:

if(oDataOne instanceOf DataTypeOne){
    ((DataTypeOne) oDataOne).getsName();  // this will return the Name if oDataOne is really of the type DataTypeOne
}

MyData類型的對象不知道是否有任何其他類擴展它,因此無法訪問這些類的成員。

您必須將對象轉換為特定類型才能訪問特定成員。

如果您發現自己處於這種情況,您可以非常確定您的設計存在缺陷。 如果需要為每種類型的MyData擴展執行特定操作,請在界面中添加一個方法,例如specialAction() ,並隱藏其中的細節。 這消除了找出你正在處理哪個子類的全部需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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