【问题标题】:Pass-through constructors from its base class从其基类传递构造函数
【发布时间】:2015-11-12 09:24:02
【问题描述】:

外部框架具有以下类:

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 中构造函数的编写方式之间的唯一区别是 SmallBoat 或 Canoe 这个词。其他一切都一样。

因此,如果有一种方法可以在不实际使用构造函数中的类名的情况下编写构造函数,那将有很大帮助。我可以在没有 .tt 文件的情况下使用直接复制和粘贴(这对我来说并不可行——我的大部分工作都没有在 Visual Studio 中完成)。有没有办法做到这一点?

【问题讨论】:

    标签: c# inheritance constructor


    【解决方案1】:

    没有。那没有。您必须指定要从当前类中使用的基类的哪些构造函数。不提真实的类名就没有办法写构造函数。

    这可能是您所展示的简化,但如果 Initialize 是唯一调用的方法,您可能希望将该调用移至调用受保护的 Initialize 方法的基类,您可以从实现类中重写。 (您必须考虑调用该方法和实例化属性/字段的顺序。在那里您可能会遇到麻烦,因此在您的情况下可能不可行)

    【讨论】:

    • @William:需要更多帮助吗?
    【解决方案2】:

    1.代码输入自动化

    有代码 sn-p : ctor 有助于创建“唯一”默认构造函数。
    要使用它,请键入ctor 两次制表。

    可以复制原始代码 sn -p 来创建自己的。
    在 Visual Studio 中,输入Tools menu/Code snippet manager
    您可以在此处查看 sn-p 文件的目录。
    您可以将 sn-p(例如 ctor.snippet)复制到“My Code Snippets”,重命名并进行编辑。

    2.船的层次结构设计

    还可以设计船层次结构,使基类中只有一个默认构造函数,并且基类中有公共属性或公共方法来提供LakeAxeBoatMaker , ...

    【讨论】:

      【解决方案3】:

      如果您可以更改设计,我强烈建议将对象实例化与对象本身分开。这样,Factory Method 结合 Template Method 设计模式就非常有用:

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

      【讨论】:

      • 我希望我能做到。但我无法控制框架。
      • 那么什么类型和类是你无法控制的?
      • 船及其构造函数中的一切。
      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      相关资源
      最近更新 更多