[英]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編譯器就是oDataOne
和oDataTwo
是MyData
對象。 由於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.