2017-09-02 90 views
1

我有一個接口MyInterface的用兩種方法doSomething的()和doSometingElse()。我不能訪問具體類方法polymorhically

我有一個抽象的公共類A,實現這個接口。 我有一個類C擴展類A,因此也實現了接口的方法。 在主要方法上,我將類C的對象分配給MyInterface引用,如: MyInterface myiface = new C();

問題是,如果我在任一類(抽象或具體)添加一些方法,我不能通過引用myiface調用方法。我必須先貶低它。 對於Deitel(第10章多態性和接口)的程序員,我不應該能夠多變性地訪問該類,如在書中所示:Java SE8?

+0

號的變量的類型的MyInterface的,因此編譯器不可能假設還有其它方法比MyInterface的該變量調用中聲明的一個。如果您需要訪問的方法,然後讓A型的變量,如果你需要訪問的C方法,然後使它C型 –

+1

代碼是值得1024個字。通過向我們展示所涉及的接口和類的最小代碼,上面的所有語句都可以更清晰,更清晰地表達。 –

+0

*「因爲它是在書的Java SE8所示的Deitel(第10章多態性與接口的程序員」 *我們不能幫你一點沒有你的報價,你覺得意味着你必須訪問的'C新功能部件''從MyInterface'。 –

回答

0

想象一下吧......假設你的MyInterface被命名爲'Animal',並且你有兩個實現它的類,名爲'Dog'和'Cow'。只因爲它們都是動物,你不會指望狗突然給牛奶,對吧?在這個比喻中,giveMilk()是一個只由Cow類實現的方法。

你明白嗎?

1

我不應該能夠多態訪問類...

你可以  —如果你的變量的類型分別爲C類型。但它不是,它的類型爲MyInterface,並且完全定義了您可以訪問的實例的功能。是的,實例具有更多功能,但寫入接口的代碼不知道。

將特徵添加到C與多態性無關。在這種情況下,多態性(有幾種不同類型)是AC可以以不同的方式實現MyInteface的功能,但是使用實例通過MyInterface引用的代碼既不知道也不關心實例是A s或C s;所有它知道,所有它應該知道,是他們聲稱是忠實的MyInterface實施。

讓我們舉一個具體的例子:

public void doSomethingWith(List list) { 
    // ... 
} 

當事情稱之爲doSomethingWith,它通過在滿足List接口的實例。那是所有,該方法知道有關該實例(缺席像instanceofgetClass)。實例可以是ArrayListLinkedListStack等;但使用它的代碼並不知道或關心這一點。它只知道這是一個List。即使該方法通過ArrayList,它也不能使用(說)ensureCapacity,而不首先向下轉發引用(如果實例不是ArrayList,將會失敗),因爲並非所有的List實現都有ensureCapacity

+0

我現在明白爲什麼我很困惑與書的範例。 在書中作者呼籲應付帳款和名爲Employee抽象類實現此接口的接口。還有一個名爲SalariedEmployee的具體類。這兩個類重寫ToString ()方法,您可以直接從該對象調用它,如果不管它是對接口的引用。因此,我認爲這將是其他實現方法具的情況下ds也是如此,但事實並非如此。 謝謝T.J Crowder,我認爲你的回答是對這個問題的回答。 – D3bian0s