从其基类传递构造函数
本文关键字:构造函数 基类 | 更新日期: 2023-09-27 18:21:41
外部框架具有以下类:
public class Boatmaker
{
}
public class Wood
{
}
public class Axe
{
}
public class Lake
{
}
public class Boat
{
public Boat(Wood wood, Axe axe) {
}
public Boat (Boatmaker maker) {
}
public Boat (Lake lake) {}
}
我需要对Boat进行大量的子类化。对于我的每个子类,我必须假设外部框架可能希望通过上面的任何构造函数来实例化它。所以我的子类通过构造函数。注意它们是如何永远不会消失的:
public class SmallBoat: Boat
{
public void DoSmallBoatStuff() {
// some code here
}
private void Initialize() {
this.DoSmallBoatStuff();
}
public SmallBoat(Wood wood, Axe axe): base(wood, axe) {
this.Initialize();
}
public SmallBoat (Boatmaker maker): base(maker) {
this.Initialize();
}
public SmallBoat (Lake lake): base(lake) {
this.Initialize();
}
}
public class Canoe: SmallBoat
{
public void DoCanoeStuff() {
// some code here
}
private void Initialize() {
this.DoCanoeStuff();
}
public Canoe(Wood wood, Axe axe): base(wood, axe) {
this.Initialize();
}
public Canoe (Boatmaker maker): base(maker) {
this.Initialize();
}
public Canoe(Lake lake): base(lake) {
this.Initialize();
}
}
我想知道是否有一种方法可以简化代码的外观。在SmallBoat和Canoe中编写构造函数的方式之间的唯一区别是单词SmallBoate或Canoe。其他一切都是一样的。
因此,如果有一种方法可以在不实际使用构造函数中类的名称的情况下编写构造函数,这将有很大帮助。我可以在没有.tt文件的情况下使用直接复制和粘贴(这对我来说并不可行——我的大部分工作都不是在Visual Studio中完成的)。有办法做到这一点吗?
否。没有。您必须指定要使基类的哪些构造函数在当前类中可用。在编写构造函数时,没有提到真正的类名。
这可能是您所展示的简化,但如果Initialize
是唯一调用的方法,您可能希望将该调用移动到基类,该基类调用受保护的Initialize
方法,您可以从实现类重写该方法。(你必须考虑调用该方法和实例化属性/字段的顺序。你可能会在那里遇到麻烦,所以它在你的情况下可能不可行)
1。代码键入自动化
有一个代码片段:ctor
,它帮助创建"仅"默认构造函数
要使用它,请键入ctor
两次表格。
可以复制原始代码片段来创建自己的代码片段
在Visual Studio中,转到Tools menu/Code snippet manager
您可以在这里看到代码片段文件的目录
您可以将一个代码段(例如ctor.snippet
)复制到"My Code Snippets
",对其进行重命名和编辑。
2.船舶层次结构的设计
还可以设计boat层次结构,使基类中只有一个默认构造函数,并且基类中有公共属性或公共方法来提供Lake
、Axe
、BoatMaker
。。。
如果您可以更改设计,我强烈建议将对象实例化与对象本身分开。这样,工厂方法与模板方法相结合的设计模式非常有用:
public abstract class BoatFactory
{ protected abstract void Initialize();
protected Wood Wood;
protected Axe Axe
protected Boatmaker Boatmaker ;
public Boat MakeBoat(Wood wood, Axe axe)
{
this.Wood = wood;
this.Axe = axe;
Initialize();
}
public Boat MakeBoat(Boatmaker maker)
{
this.Boatmaker = Boatmaker ;
Initialize();
}
public Boat MakeBoat(Lake lake)
{
this.Lake = lake;
Initialize();
}
}
public class SmallBoatFactory : BoatFactory
{
protected override void Initialize()
{
// do customized init operations here
}
}