c#继承问题.我无法在继承链中看到方法

本文关键字:继承 方法 问题 | 更新日期: 2023-09-27 18:15:38

我想我可能有c#继承问题。

当运行时,下面的代码产生一个"System类型的异常"。NullReferenceException' occurred"错误消息。

在Visual Studio中调试时,我看到变量"path"在我的"Finder"类中总是为空。

它似乎甚至没有得到"WebConnector"类中的"GetUrl"方法,这可能解释了我得到的null错误消息,但我不确定为什么它不能首先得到该方法。

我继承基类错误吗?

谢谢!

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??
    }
}

c#继承问题.我无法在继承链中看到方法

需要一个WebConnector的实例。您可以在BaseClass构造函数中创建它:

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

正如其他人所说,您永远不会初始化Connector。这个问题有两个解决方案:

首先,您可以将GetUrl函数设置为静态,因为它不使用对象本身中的任何内容:

public static String GetUrl(string Id, String baseUrl)

在这种情况下,您甚至不需要对类的引用,因此您可以完全从BaseClass中删除Connector并更改GetBuild函数,如下所示:

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

然而,我不认为这是你正在寻找的行为,因为WebConnector听起来像是你想在某个时候实际初始化的东西。

你可以用两种方式初始化它,任何一种都可以,所以你可以选择。

首先,你可以修改你的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被调用时被初始化,你实际上可以在Finder构造函数中使用Connector (c#总是从最基本的类构建到最派生的类)。