繁体   English   中英

访问基类变量 C#

[英]Accessing base class variables C#

我有基类

public class X
{
   public int Id;
   public int i;
}

和派生类

public class Y : X
{

//other variables

}

我的解决方案中有 3 个项目。 X 类在项目 A 中,Y 类在项目 B 中,在项目 CI 中我正在尝试执行以下操作:

Y newY = new Y();
newY. // this is where no variables from base class are showed (no Id or i)

如果我从项目 C 中引用项目 A,它就可以工作。 但是我可以不从 C 引用项目 A 吗?

现有的参考是:B -> A 和 C -> B

Project B确实需要引用Project A因为类 Y 派生自类 X,并且一些父功能仅在Project A中编写。

因此,在您的邮件项目中仅添加对ProjectB (而不是ProjectA )的引用,并尝试调用ProjectB功能肯定会在编译时失败。

像下面。

//of Project A
public class X
{
    public string XStr;
    public void MethodOfX()
    {
        
    }
}

// of Prject B
public class Y : X
{
    public string YStr;
    public void MethodOfY()
    {
        //values form Project A is available
        // as assembly reference has added here
        YStr = XStr;
        MethodOfX();
    }
}

你可以看到,在这里你也可以访问类 x 的属性。 作为ProjectA参考已添加到ProjectB

并在主班。 如果我们尝试以下操作,则仅添加对ProjectB引用。

    static void Main(string[] args)
    {
        Y y = new Y();
        y.MethodOfY();
    }

Y y = new Y()我们将在编译时收到此错误,

类型“ProjectA.X”是在未引用的程序集中定义的。 您必须添加对程序集“ProjectA,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”的引用。

这里的错误是不言自明的。 它只是说明为了执行Y y = new Y()你需要处理ProjectA.X (在我们的例子中是因为我们继承了它)和具有ProjectA.X定义的程序集尚未在主要项目。

看看这个问题

因为在这里我们让Y继承X我们需要在我们的主项目中添加对ProjectA引用,因为在这种情况下Y持有一些在ProjectA定义的功能。

由于我们没有在我们尝试创建 Y 对象的主项目中添加ProjectA的引用,该对象将无法公开 Y 的那些在ProjectA中定义的功能和成员


但是如果我们像下面这样改变我们的代码。

//of Project A
public class X
{
    public string XStr;
    public void MethodOfX()
    {
        Console.WriteLine("Method of x");
    }
}

// of Prject B
public class Y 
{
    public string YStr;
    public void MethodOfY()
    {
        Console.WriteLine("Method of Y");
        X x = new X();
        //values form Project A is available
        // as assembly reference has added here
        YStr = x.XStr;
        x.MethodOfX();
    }
}

请注意,现在 Y 没有继承 X,而是简单地创建 X 的一个实例并使用它。

static void Main(string[] args)
    {
        try
        {
            Y y = new Y();
            y.MethodOfY();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        Console.Read();
    }

在我们的主项目中,即使只添加了ProjectB而不是ProjectA引用,上面的代码也不会导致任何异常。 因为这里在创建Y主项目的对象时不需要处理ProjectA因为 Y 的所有功能和成员仅在projectB

并且在调用MethodOfY()方法时,即使该方法MethodOfY()内部调用 x 的方法,如果ProjectA dll 存在于应用程序的运行路径中(如果您正在调试,通常在 Debug 文件夹中),则将处理此调用。

注意:如果 ProjectA 的 dll 在任何情况下都不存在,它会在调用MethodOfY()时抛出一个MethodOfY() ,说它无法加载ProjectA dll(当然因为它不存在那里)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM