来自其基类

时间:2015-11-12 09:24:02

标签: c# inheritance constructor

外部框架具有以下类:

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

我需要做很多船的子类化。对于我的每个子类,我必须假设外部框架可能希望通过任何上述构造函数实例化它。所以我的子类得到了传递构造函数。注意它们永远不会消失:

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中完成的)。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

没有。那没有。您必须指定要从当前类中提供的基类的哪些构造函数。没有提到真正的类名,就无法编写构造函数。

这可能是您正在展示的简化,但如果new Vue({ el: '#app', data: { active: { }, }, ready: function() { this.addActive(); }, methods: { addActive: function(){ $(document).on('click', '[prop-name]', function (e) { var target = e.target; this.active = { name: $(target).attr('prop-name'), latitude: $(target).attr('prop-lat'), longitude: $(target).attr('prop-long'), icon: $(target).attr('prop-icon'), }; }.bind(this)); } } }); 是唯一调用的方法,您可能希望将该调用移动到调用受保护的Initialize方法的基类,您可以从实施课程。 (你必须考虑调用该方法和实例化属性/字段的顺序。你可能会遇到麻烦,所以在你的情况下它可能不可行)

答案 1 :(得分:1)

<强> 1。代码输入自动化

有代码段:ctor有助于创建&#34;仅#34;默认构造函数 要使用它,请键入ctor两次制表。

可以复制原始代码段以创建自己的代码段 在Visual Studio中,进入Tools menu/Code snippet manager 您可以在此处看到代码段文件的目录 您可以将代码段(例如ctor.snippet)复制到&#34; My Code Snippets&#34;,重命名并编辑。

<强> 2。船的层次结构设计

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

答案 2 :(得分:1)

如果你可以改变设计,我强烈建议从对象本身单独进行对象实例化。这样,Template Methodhttp://lancenewman.me/posting-a-photo-to-instagram-without-a-phone/设计模式相结合非常有用:

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