我有基类
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 - >乙
答案 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(当然是因为它那里不存在)