类A
public class A
{
    public A(int x)
    {
      init()
    }
    pulbic void init()
    {
      ...
    }
}
//类B,继承A,调用父类构造函数
public class B : A
{
    int a;
    public B(int x):base(x)
    {
      a=1;
    }
}
这样的话是否是先执行base(x)即父类的构造函数里的,再执行a=1;
但现在我想 先执行a=1,而后在执行base(x)里的方法,应该怎么写?

解决方案 »

  1.   

    //类B,继承A,调用父类构造函数
    public class B : A
    {
        int a = 1;
        public B(int x):base(x)
        {
          //a=1;
        }
    }
      

  2.   

    coowoo(coowoo)的方案是可以的,有点取巧性质
      

  3.   

    to 这样的话是否是先执行base(x)即父类的构造函数里的,再执行a=1;
    但现在我想 先执行a=1,而后在执行base(x)里的方法,应该怎么写?为什么会有这样奇怪的想法,难道你的基类要做什么不寻常的处理吗。
      

  4.   

    a=1 我只是举个例子 其实是一个较为复杂的方法体 所以coowoo(coowoo)的方案是不行的 我觉得在java里面的设置就比较好 super()方法 放在方法体内 可以先执行本类的初始化代码 再执行基类的初始化代码
      

  5.   

    这种用法在Delphi里也是可以的
      

  6.   

    to a=1 我只是举个例子 其实是一个较为复杂的方法体 所以coowoo(coowoo)的方案是不行的 我觉得在java里面的设置就比较好 super()方法 放在方法体内 可以先执行本类的初始化代码 再执行基类的初始化代码本人倒觉得.net和以前c++的执行顺序合理些,再说基类构造函数中又不会使用到子类中的成员。
      

  7.   

    to Knight94(愚翁) 这个想法很奇怪么? 我其实就是想在类B中的构造函数改变类A中的某个变量的值,然后再进行init()这个操作
      

  8.   

    to Ninputer(装配脑袋)
    我觉得楼主应该直接描述想达成的效果,不该钻牛角尖 也许有更自然的做法呢 恩 这个倒是有可能 我等下再贴一下详细的代码 你看看
      

  9.   

    原来是这样,你的思路不太对。你应该把A这个类的Init函数做成virtual的,然后在B中override这个Init,然后你就可以在B的Init里做想做的事情了
    public class B : A
    {
        protected override void Init()
        {
            //先改A的变量
            base.Init(); //调用A的Init,完成!
        }
    }
      

  10.   

    to 这个想法很奇怪么? 我其实就是想在类B中的构造函数改变类A中的某个变量的值,然后再进行init()这个操作那你的A类不是提供了带参数的构造函数了吗,至于你的操作细节,你可以在A类构造函数中进行处理。
      

  11.   

    类A
    public class A
    {
        private int m;
        private int sum
     
        public A(int x)
        {
          m=x;
          init()
        }
        pulbic void init()
        {
          sum=m+m;
          ...
        }
        public int M
        {
            get
        {
    return m
        }
    set
        {
    m
        }
        }
    }
    //类B,继承A,调用父类构造函数
    public class B : A
    {
        public B(int x):base(x)
        {
          //改变m的值
          M=x*2;
          init();   //这些写的话 结果没错 但是 重复执行了 init(),如果不写则达不到计算的效果;
        }}
      

  12.   

    按照我说的
    pulbic void init()改成
    public virtual void Init()然后子类override
    //类B,继承A,调用父类构造函数
    public class B : A
    {
        public B(int x):base(x)
        {
        }
        
        public override void Init()
        {
            //改变m的值
            base.M=x*2;
            base.Init(); 
        }}
      

  13.   

    写错了一点点
    base.M = base.M * 2;
      

  14.   

    to Ninputer(装配脑袋)  谢谢 开始 我也是这样写的 这样写可以实现 但是后来因为考虑到m的值必须通过构造函数来获取,所以直接就在构造函数里改变他的值了,但发现就行不通了
      

  15.   

    貌似应该是这样 
    public override void Init(int x)
        {
            //改变m的值
            base.M=x*2;
            base.Init(); 
        }
      

  16.   

    你可以让Init也带有参数啊,然后A让构造函数直接调用Init,全权交给Init处理
      

  17.   

    但这样就会有一个问题 就是方法 init必须带一个参数 变成init(x) 而我的基类是不需要这个参数的
      

  18.   

    你可以让它带有,然后连m的赋值都改在Init中进行
        public A(int x)
        {
          m=x;
          init()
        }
        pulbic void init()
        {
          sum=m+m;
          ...
        }
    改为
        public A(int x)
        {
          init(x);
        }
        pulbic virtual void init(int x)
        {
          m = x;
          sum=m+m;
          ...
        }
      

  19.   

    哦,不成,m的赋值还是得在构造函数。
    但你已经把x保存在m里了,你的子类为什么不直接用m?
    不管遇到多少困难,你再按照这个思路细分那些方法的职能,总能找到子类可以扩展基类的最佳方式。
      

  20.   

    呵呵 这种写法就是我最初用的方法 但是 这样调用的话,每次调用base.init(),不是同样会重复执行m=x这一句么,其实我的初始化代码很多,远不止m=x这么一句,这样的话是不是影响效率
    ,因为我后面的每个子类都要以不同的形式改变m值。
      

  21.   

    恩 
    方法是可行的 但是init必须带上一个无用的参数 所以 我才怀疑是否有更好的方法,是否可以改变构造函数的初始化顺序还是非常感谢 Ninputer(装配脑袋) 如此耐心 :)
      

  22.   

    PS. Java真的允许在子类构造函数的任意位置调用基类构造函数吗?
      

  23.   

    这个倒真没试过  不知道是不是可以 但是java的super()是放在构造函数体内的,而不是像c#这样子:base()
      

  24.   

    VB.NET也是把调用父类构造函数的代码直接写在函数里面的,但他必须是函数体里面的第一句话,若不是就编译错误……
    所以我怀疑Java是不是也是这样
      

  25.   

    Delphi的inherited.Create放在哪都行