访问基类变量C#

时间:2018-05-28 23:24:17

标签: c#

我有基类

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

和派生类

public class Y : X
{

//other variables

}

我的解决方案中有3个项目。类X在项目A中,在项目B中是Y类,在项目C中我正在尝试:

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 - >乙

1 个答案:

答案 0 :(得分:1)

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 assambly 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的汇编还没有在主项目中引用。

查看此question

在这里,我们要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 assambly 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()时,即使该方法内部也调用x的方法,如果在应用程序的运行路径中存在ProjectA的dll,则会处理此调用(如果您正在调试,通常在Debug文件夹中。)

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