2011-08-19 88 views
2
public class A 
{ 
    public int F() 
    { 
    // do something 
    } 
} 

public class B : A 
{  
    public static B F() 
    { 
     B b = new B(); 
     // do something more with b 
     b.base.F(); // this doesn't work 
     b.A.F(); // this doesn't work either 
     return b; 
    } 
} 

調用A.F()的正確語法是什麼?請注意B.F()是一個靜態函數。調用靜態函數內部的基類過載函數?

關於編輯「改名字評論」:

請不要犯錯誤從此剝離下來的基本例子得出結論。實際上這些函數是用來讀取XML的,所有受影響的類的函數簽名是ReadXML (XmlNode parent, int id)

+0

你試過嗎?((A)B).F()'?儘管我的首選解決方案是重命名其中一個F。 :) – Chris

+1

這不能被認爲是超載功能的一個壞的使用? – m0skit0

+0

你不能通過這種方式調用,你應該嘗試在類A中創建一個構造函數,然後在這個構造函數中調用方法F() – Gandarez

回答

3

下面將工作(測試現在這樣一個正確的答案)來調用A類的F方法。

public static B F() 
    { 
     B b = new B(); 
     // do something more with b 
     ((A)b).F(); // this works 
     return b; 
    } 

您可能想考慮更改名稱。我發現很難相信一個描述性的方法名稱對於返回int的東西以及返回類型B的東西是一樣的。也許後者應該在某處有一個Create,因爲它似乎是某種工廠方法?

+0

+1爲「更改名稱」。 –

+0

...不知道實際應用。這個例子儘可能地減少了。 – karx11erx

+0

@ karx11erx:是的,這就是爲什麼我只是說你應該考慮它而不是你絕對應該。我認爲它被削減了,可能會比我們看到的還多。否則,我一直在抱怨你可怕的變量和類名。 ;-) – Chris

0

我認爲不可能使用任何需要使用實例/繼承的關鍵字,例如靜態方法中的basethis。由於在B類中調用F(),因此沒有類B的實例,因此您不能引用任何base

正如你在B.F()創建A類的對象,並調用AF()a.F(),或者你需要F()AstaticB.F()調用A.F()的選項。

+0

'B b = new B();'會不同意你的陳述,即沒有B類的實例。另外你的選項將完全改變有問題的代碼。在B.F()中創建一個類A的對象將無助於創建創建的b類。並且使A中的F()成爲靜態將阻止它處理我假定「做某事」正在做的事件。 – Chris

+0

@Chris似乎你讓我錯了......你可以創建類的實例,但是你不能使用任何關鍵字來處理像base這樣的實例... – Incognito

+0

哦,我明白你的意思了......我猜它有助於解釋他爲什麼做不到的工作,但我仍然不認爲這特別回答了這個問題。 – Chris