2017-07-16 68 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()”方法,然后在那里设置那些引用构建类。 –