10.8 跨程序集的继承
程序集[1]可以简单理解为类的物理组织形式,而命名空间则可认为是类的逻辑组织形式。只有指定了类所在的程序集以及命名空间,编译器才能“找到”该类型。一个程序集明确地说就是一个EXE或DLL。可能有人会有疑问,为什么我们从来都没有向编译器指定某个特定的程序集?那是因为截至目前为止,我们所有的类都定义在同一个程序集中。跨程序集继承其实并不复杂,只是相对于在同一个程序集中继承,需要另外添加对那个程序集的引用而已。
下面,我们新建一个类库工程:MyLibrary,然后在其中新增一个类:BaseClass,如图10-4所示。
图 10-4 MyLibrary程序集及BaseClass类
这里的BaseClass是基类,我们将在另一个程序集(ConsoleApplication1)中新建一个继承自它的派生类:ChildClass,首先要添加对MyLibrary程序集的引用,如图10-5所示。
图 10-5 添加对MyLibrary程序集的引用
然后编写ChildClass的代码,如代码清单10-9所示。
代码清单10-9 ChildClass的代码
class ChildClass:BaseClass
{
}
此时,Visual Studio还不知道这个BaseClass定义在哪里,需要我们提供进一步的信息,比如在哪个程序集,哪个命名空间等。此时,单击BaseClass左下角的代码提示,可以快捷地列出目标类可能位于哪个程序集或命名空间[2],注意,如果此前没有指定BaseClass所在的程序集,Visual Studio将无法获取元数据信息,即不能提供被选类供你选择,只能选择新建类,如图10-6所示。
我们虽然没有为派生类ChildClass定义任何新的成员,它仍然具有基类所具有的一些非私有成员。下面,我们调用它继承的基类方法,如代码清单10-10所示。
图 10-6 使用Visual Studio的IntelliSense功能选择目标类
代码清单10-10 调用ChildClass的基类方法
class ClassExample
{
public static void Main()
{
ChildClass child=new ChildClass();
child.DoSomething();
}
}
上述代码的运行结果如下:
我在基类中……
[1]程序集,详见第22章。
[2]Visual Studio的IntelliSense功能其实依赖的是程序集内含的元数据进行工作的。