
10.8 代码的生成和重构
Visual Studio 2015和.NET Framework的一个主要目标是减少开发人员的编码量。有两种方式可以达到这个目标:减少总编码量或减少手动编写的编码量。第一种方法通过.NET Framework中的大量基类得到了支持,第二种方法通过Class Designer中的代码生成和重构工具得到了支持。
10.8.1 拖放式代码生成
类图上执行的几乎每个操作都会改变底层的源代码,并提供某种级别的代码生成功能。前面介绍了许多这类改变,如在Class Details窗口中给类添加属性或方法。而通过操作类图可以执行一些高级代码生成操作。
可以使用Inheritance连接器在父类和继承类之间建立继承关系。此时,派生类的代码文件就会更新,以反映这个变化。但如果父类是抽象的,如图10-7中的Product类,Class Designer就可以进行一些其他的分析或代码生成操作。如果父类是抽象的且包含抽象成员,这些成员就会在继承类中自动实现,图10-7(b)在Book类中添加抽象属性Description、Price、SKU,没有实现GetInventory()方法,因为它没有标记为抽象。

图10-7
Inheritance连接器可以通过多种方式使用,以自动生成代码。在图10-8(a)中,在类图中添加ICrudActions接口。把Inheritance连接器从接口拖放到类中时,接口的所有成员都在类上实现,如图10-8(b)所示。

图10-8
下面是在Book类中添加ICrudActions接口时自动生成的代码。
C#
#region ICrudActions Members public Guid UniqueId { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public void Create() { throw new NotImplementedException(); } public void Update() { throw new NotImplementedException(); } public void Read() { throw new NotImplementedException(); } public void Delete() { throw new NotImplementedException(); } #endregion
VB
#Region ICrudActions Members Public Property UniqueId As Guid Get throw new NotImplementedException() End Get Set throw new NotImplementedException() End Set End Property Public Sub Create() throw new NotImplementedException() End Sub Public Sub Update() throw new NotImplementedException() End Sub Public Sub Read() throw new NotImplementedException() End Sub Public Sub Delete() throw new NotImplementedException() End Sub #End Region
10.8.2 IntelliSense代码生成
Class Designer的其他代码生成功能可以在IntelliSense子菜单中使用。这些代码生成功能仅应用于类,所以只有在类图中选择了类或抽象类,这个菜单才是可见的。这个菜单包含的两个代码生成功能是Implement Abstract Class和Override Members。
Implement Abstract Class功能可以在继承的子类中实现基类中的所有抽象成员。要访问这个功能,可以右击继承的子类,选择IntelliSense | Implement Abstract Class。
Override Members功能可以从基类中选择要重写的公共属性或方法。要访问这个功能,可以右击继承的子类,选择IntelliSense | Override Members命令,打开如图10-9所示的对话框,其中显示了基类和没有重写的属性或方法。

图10-9
10.8.3 用Class Designer进行重构
如第8章所述,Visual Studio 2015允许从代码编辑器窗口中重构代码。在处理类图中的实体时, Class Designer也提供了许多重构功能。
要使用Class Designer中的重构功能,可以右击一个实体或其成员,从Refactor子菜单中选择一个操作。可以使用下面的重构功能。
●Rename Types and Type Members:可以在类图或Properties窗口中重命名类型或类型的成员。这会把代码中所有的旧名称改为新名称。甚至可以确保该操作应用于注释或静态字符串。
●Encapsulate Field:可以从已有的字段中快速创建新属性,再用对新属性的引用更新代码。
●Reorder or Remove Parameters(仅用于C#):可以改变类型中方法参数的顺序,或者从方法中删除参数。
●Extract Interface(仅用于C#):可以把类型的成员提取到新接口中。这个功能允许只选择部分成员,放在新接口中。
还可以使用标准的Windows Cut、Copy或Paste操作,在类型之间复制或移动成员。