2015-10-02 31 views
1

我想我可能有C#繼承問題。c#繼承問題。我看不到我的繼承鏈中的方法

運行時,下面的代碼會生成一個「發生類型'System.NullReferenceException'的異常'錯誤消息。

在Visual Studio中進行調試時,我發現變量「path」在我的「Finder」類中始終爲空。

它似乎甚至沒有得到「WebConnector」類中的「GetUrl」方法,這可能解釋了我得到的空錯誤消息,但我不確定它爲什麼無法獲得該方法擺在首位。

我繼承基類錯了嗎?

謝謝!

WebConnector.cs:

public class WebConnector 
{ 
    public String GetUrl(string Id, String baseUrl) 
    { 
     string right = String.Format("/a('{0}')/b", Id); 
     return baseUrl + right; 
    } 

baseClass.cs:

public class BaseClass 
{ 

    public WebConnector Connector { get; set; } 

} 

Finder.cs:

public class Finder : BaseClass 
{ 

    public String GetBuild() 
    { 
     var path = Connector.GetUrl(Id, baseUrl); //always null?? 
    } 

} 
+3

在哪裏或你如何設置'Connector'? –

+5

'Finder.Connector'永遠不會被實例化,所以你不能調用'GetUrl'。如果'GetUrl'是靜態的,那麼你可以,因爲它不需要'Connector'的實例。 – sab669

回答

4

您需要的WebConnector一個實例。你可以在你的BaseClass構造函數創建此:

public class BaseClass 
{ 
    public BaseClass() 
    { 
     Connector = new WebConnector(); 
    } 

    public WebConnector Connector { get; set; } 

} 
2

正如其他人所說,你永遠不會初始化Connector。有2個解決問題的對策:

首先,你可以讓你的GetUrl功能靜態的,因爲它沒有對象本身使用任何東西:

public static String GetUrl(string Id, String baseUrl) 

在這種情況下,你甚至不會需要把類的引用,所以你可以完全去除BaseClassConnector更改GetBuild功能,像這樣:

var path = WebConnector.GetUrl(Id, baseUrl); 

不過,我不認爲這就是你要找的行爲因爲WebConnector聽起來像是你想在某個點實際初始化的東西。

你可以用2種方式對它進行初始化,並且兩者都可以工作,所以請選擇。

首先,你可以修改你Finder類,包括初始化Connector構造:

public class Finder : BaseClass 
{ 
    public Finder() 
    { 
     Connector = new WebConnector(); 
    } 

    public String GetBuild() 
    { 
     var path = Connector.GetUrl(Id, baseUrl); 
    } 
} 

另一種選擇是在BaseClass來處理這個問題,通過修改它像這樣:

public class BaseClass 
{ 
    public WebConnector Connector { get; set; } 

    public BaseClass(){ 
     Connector = new WebConnector(); 
    } 
} 

如果你走這條路線,Connector將會在Finder被調用後立即初始化,並且你實際上可以在中使用構造函數(C#總是從大多數基類構建到最派生類)。