2015-08-25 11 views
2

我一直在環顧四周,即使我找到了一些答案,因爲某些原因,我似乎無法理解這個概念,這顯然會在我的代碼中造成問題。多態性,在我的程序上的問題

我有這樣的:

public static Contact createContact() { 

    Contact contact = null; 

    if (ContactUI.getRdb_acquaintance().isSelected()) { 
     contact = new Acquaintance(); 
    } else if (ContactUI.getRdb_friend().isSelected()) { 
     contact = new Friend(); 
     //contact.setStr_telMobile(ContactUI.getTxt_telMobile().getText()); 
    } else { 
     contact = new Family(); 
     //contact.setStr_telMobile(ContactUI.getTxt_telMobile().getText()); 
     //contact.setStr_BDay(ContactUI.getTxt_BDay().getText()); 
    } 

    setCommonDetails(contact); 

    return contact; 
} 

我想是能夠調用子類具體方法.setStr_telMobile.setStr_BDay我一旦初始化接觸,它的子類之一,但我得到一個錯誤,我無法訪問這些方法。我在我的代碼中註釋了這些行。

我以爲我應該能夠初始化Contact類型的對象(例如Contact的子類),並且可以訪問子類專用的方法和屬性。

+1

提供超和子類實現 - 你試圖定義超類的一部分的方法? (是聯繫一個班級或接口?) –

+0

不,它不是,正如op說的那樣。和聯繫是一個類。 – JacksOnF1re

+5

如果您的成員變量是聯繫人類型,則只能使用Contact類提供的方法。 – JacksOnF1re

回答

1

正如我在評論中所說,如果您將超類作爲成員變量實例化,則無法訪問子類中的方法。

如果您需要訪問子類實現,則需要進行強制轉換。

if(contact instanceof Friend){ 
Friend friend = (Friend) contact; 
drinkBeerWith(friend); 
} 

,考慮其他的模式來實現你的代碼。也許多態性 不是在這裏做的。一個指標,表明您的設計概念 可能是「錯誤」的一種是使用instance of

乾杯

編輯:

我想是能夠調用子類具體方法.setStr_telMobile和.setStr_BDay一旦我初始化接觸

這些方法的聲音因爲每個聯繫人都有一個手機號碼和 生日,對不對?

如果是這樣,實現方法爲抽象方法在超類和 讓子類overright他們

public abstract void setStr_telMobile (String mobileNumber); 
+1

謝謝!我得到它的工作:) – oneteen

+0

我很高興它解決了你的問題。快樂的編碼。 – JacksOnF1re

1

不管它的運行時類型,contactContact類型的引用。因此,編譯器將只允許您使用Contact的方法。

優雅的方式來解決這個問題很可能是使用臨時Friend參考你所需要的所有成員初始化,然後纔將其分配給Contact

// Snipped 
} else if (ContactUI.getRdb_friend().isSelected()) { 
    Friend temp = new Friend(); 
    temp.setStr_telMobile(ContactUI.getTxt_telMobile().getText()); 
    contact = temp; 
} 
// snipped 

或者,因爲你知道你已經分配contactFriend例如,你可以明確其向下轉換到一個Friend來訪問它的方法:

// Snipped 
} else if (ContactUI.getRdb_friend().isSelected()) { 
    contact = new Friend(); 
    ((Friend) contact).setStr_telMobile(ContactUI.getTxt_telMobile().getText()); 
} 
// snipped 
+0

非常感謝!我用這個向下轉換它完美的作品:) – oneteen