如下面这个例子:
public class Factor
    {
        public string Name { get; set; }
        public string Desc { get; set; }
}public class Factores
    {
        public Factor F01;
        public Factor F02;
        public Factor F03;        public string GetF01Desc(){
             Console.WriteLine(this.F01.Desc);
        }
    }    public class WaterFactors : Factores
    {
        new Factor F01 = new Factor() { Name = "F01", Desc = "流量" };//为什么这里不能直接写 F01 = new Factor() { Name = "F01", Desc = "流量" }
        new Factor F02 = new Factor() { Name = "F02", Desc = "COD" };
        new Factor F03 = new Factor() { Name = "F03", Desc = "PH" };
    }    public class GasFactors : Factores
    {
        public Factor F01 = new Factor() { Name = "F01", Desc = "SO2"};
        public Factor F02 = new Factor() { Name = "F02", Desc = "NOx" };
        public Factor F03 = new Factor() { Name = "F03", Desc = "烟尘" };
    }    public class Test(){
        public void GetFactoreDesc(Factores f){
            Console.Write(f.GetF01Desc());
        }        public vode t(){
             GasFactors gas = new WaterFactors();
             GetFactoreDesc(gas);   //请问一下这一句为什么弹出 F01 is null呢?而不是“SO2”
        }
    }

解决方案 »

  1.   


    F01 = new Factor() { Name = "F01", Desc = "流量" }
    父类中存在public F01,子类继承这个属性,自带F01属性,再执行这一条就不是声明了,而已逻辑赋值。要放在方法体中才可以。
      

  2.   


    我感觉这个根本编译不过去的,你怎么得到的 Null?
      

  3.   

     public class WaterFactors : Factores
      {
      new Factor F01 = new Factor() { Name = "F01", Desc = "流量" };//为什么这里不能直接写 F01 = new Factor() { Name = "F01", Desc = "流量" }
      new Factor F02 = new Factor() { Name = "F02", Desc = "COD" };
      new Factor F03 = new Factor() { Name = "F03", Desc = "PH" };
      }可以的吧...F01是父类的属性 子类可以访问到吧..
      

  4.   


    当然能访问到,只是
    new Factor F01 =   ....  的意思是重新声明。
    F01=               ....  的意思是逻辑赋值操作,这种操作不能直接写在这个位置。
      

  5.   


    那么我该这样写对吗?如果在子类中要初始化父类定义的变量或属性的值,都写在构造函数里。public class WaterFactors : Factores
    {
            public WaterFactors() {
                F01 = new Factor() { Name = "F01", Desc = "瞬时流量" };
                F02 = new Factor() { Name = "F02", Desc = "累计流量" };
                F03 = new Factor() { Name = "F02", Desc = "累计流量" };
            }
    }
      

  6.   

    不好意思写错了,应该是:Factores gas= new GasFactors();
    GetFactoreDesc(gas)
      

  7.   


    因为父类已经有了F01,在子类依然重新声明,那么子类重新声明的是默认new关键字的。再对同名属性进行初始化,并不改变父类的属性,但是你的方法调用是父类的this.指向的属性。
      

  8.   


    嗯,就是用子类去调用父类方法的时候,会先判断有没有new父类的字段,如果有new父类的字段,那么在父类方法里,就不使用子类new的字段,而使用父类原有的字段。
      

  9.   


    呵呵,最近对OOP感兴趣,所以现在在学习实践。O(∩_∩)O谢谢你的热心帮助。
      

  10.   


    你终于猜对了。不过这个new看的我有点乱,缕缕确实还是对的。
      

  11.   

    也谢谢fat 马的帮助,问题解决,结贴。
      

  12.   

    C#的默认继承关系与Java和C++的不太一样,需要注意下。
      

  13.   

    C# 允许派生类包含与基类方法名称相同的方法。基类方法必须定义为 virtual。如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不调用基类方法。可以从派生类中使用 base 关键字调用基类方法。override、virtual 和 new 关键字还可以用于属性、索引器和事件中。