如下面这个例子:
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”
}
}
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”
}
}
F01 = new Factor() { Name = "F01", Desc = "流量" }
父类中存在public F01,子类继承这个属性,自带F01属性,再执行这一条就不是声明了,而已逻辑赋值。要放在方法体中才可以。
我感觉这个根本编译不过去的,你怎么得到的 Null?
{
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是父类的属性 子类可以访问到吧..
当然能访问到,只是
new Factor F01 = .... 的意思是重新声明。
F01= .... 的意思是逻辑赋值操作,这种操作不能直接写在这个位置。
那么我该这样写对吗?如果在子类中要初始化父类定义的变量或属性的值,都写在构造函数里。public class WaterFactors : Factores
{
public WaterFactors() {
F01 = new Factor() { Name = "F01", Desc = "瞬时流量" };
F02 = new Factor() { Name = "F02", Desc = "累计流量" };
F03 = new Factor() { Name = "F02", Desc = "累计流量" };
}
}
GetFactoreDesc(gas)
因为父类已经有了F01,在子类依然重新声明,那么子类重新声明的是默认new关键字的。再对同名属性进行初始化,并不改变父类的属性,但是你的方法调用是父类的this.指向的属性。
嗯,就是用子类去调用父类方法的时候,会先判断有没有new父类的字段,如果有new父类的字段,那么在父类方法里,就不使用子类new的字段,而使用父类原有的字段。
呵呵,最近对OOP感兴趣,所以现在在学习实践。O(∩_∩)O谢谢你的热心帮助。
你终于猜对了。不过这个new看的我有点乱,缕缕确实还是对的。