2017-07-16 64 views
0

主要2實例類試圖共同努力

class Program 
{ 
    static void Main(string[] args) 
    { 
     Worker worker = new Worker(); 
     worker.Start(); 

     Console.ReadLine(); 
    } 
} 

Worker類

public Worker() 
    { 

    } 

    public Navigator Navigator; 
    public Scraper Scraper; 

    public void ResetVariables() 
    { 
     Navigator = new Navigator(this); 
     Scraper = new Scraper(this); 
    } 

    public void Start() 
    { 
     ResetVariables(); 
     Navigator.SetHtml(); 
    } 

Navigator類

private Worker Worker; 
    private Scraper Scraper; 

    public string Html; 

    public Navigator() 
    { 

    } 

    public Navigator(Worker worker) 
    { 
     Worker = worker; 
     Scraper = worker.Scraper; 
    } 

    public void SetHtml() 
    { 
     Html = "navigator has changed its html"; 
     Scraper.ReadHtmlFromNavigator(); //CAUSES NULL REFERENCE IF CALLED INISIDE THIS METHOD 
    } 

刮板類

private Worker Worker; 
    private Navigator Navigator; 

    public Scraper() 
    { 

    } 

    public Scraper(Worker worker) 
    { 
     Worker = worker; 
     Navigator = Worker.Navigator; 
    } 

    public void ReadHtmlFromNavigator() 
    { 
     Console.WriteLine("scraper reading html from navigator: " + Navigator.Html); 
    } 
空引用

當我從導航本身我得到一個空引用,但裏面調用Scraper.ReadHtmlFromNavigator()如果我從工人階級調用它,它工作正常:

public void Start() 
    { 
     ResetVariables(); 
     Navigator.SetHtml(); 
     Scraper.ReadHtmlFromNavigator(); 
    } 

和我得到的輸出:

scraper reading html from navigator: navigator has changed its html 

回答

0

快速回答 - 不要將引用存儲在Scrapper中,也不要將引用存儲在Navigator中。改爲使用對Worker的引用。

在方法調用SetHtmlWorker.Scraper.ReadHtmlFromNavigator()代替Scraper.ReadHtmlFromNavigator()

UPDATE: 如果你不想鍵入Woker.XXX每一次,你可能會創建一些快捷鍵:

private Navigator Navigator { get { return Worker.Navigator; } } 
private Navigator Scrapper{ get { return Worker.Scrapper; } } 
+0

的確,我之前是這麼做的,但是在尋找一種不需要輸入Worker的方法,我每次都需要其他類的東西,但無論如何,我並沒有因爲它看起來很乾淨而感到困擾。 –

+0

@JoaoVitor在我的答案中看到更新如何創建快捷方式 – opewix

0

你是第一個構建新的導航儀之前你有一個刮板:

public void ResetVariables() 
{ 
    Navigator = new Navigator(this); 
    Scraper = new Scraper(this); 
} 

因此,您的導航ator構造函數將其刮板變量設置爲尚未存在的worker.scraper。

的simpy更改順序,你應該罰款:

public void ResetVariables() 
{ 
    Scraper = new Scraper(this); 
    Navigator = new Navigator(this); 
} 

在一般情況下,雖然,重新思考如何設置你的應用程序。這種無證的強制性序列會產生問題並且是代碼味道。

+0

是的,我做了這個解決方案,但是它看起來很醜,所以我想在導航器和Scraper中有一個「SetInitialReferences()」方法,然後在那裏設置那些引用構建類。 –