在空白处使用什么以便添加";x〃;变量,而不创建另一个A对象
本文关键字:变量 创建 对象 另一个 什么 quot 添加 空白处 | 更新日期: 2023-09-27 18:00:49
我必须使用this
关键字才能将3个类中存在的x
的所有3个值相加。
不允许我在方法M1
中创建类A
的实例。
class Program
{
static void Main(string[] args)
{
C c = new C();
int op = c.M1();
Console.WriteLine(c.x);
Console.WriteLine();
}
}
public class A
{
public int x = 10;
}
public class B:A
{
public int x = 100;
}
public class C:B
{
public int x = 1000;
public int M1()
{
return (x + base.x + _____ );
//What to use in the blank space in order to
//add the "x" variable from class A without
//creating another object of A
}
}
}
将当前实例(this
(强制转换为A
。你可以使用
((A)this).x
这是你的方法的完整代码,我将如何定义它
public int M1()
{
return (x + ((B)this).x + ((A)this).x );
}
您可以使用
public int M1()
{
return (x+base.x+((A)this).x);
}
但如果你在反编译器中查看C类的构造函数
// method line 3
.method public hidebysig specialname rtspecialname
instance default void '.ctor' () cil managed
{
// Method begins at RVA 0x210c
// Code size 18 (0x12)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4 1000
IL_0006: stfld int32 stringy.C::x
IL_000b: ldarg.0
IL_000c: call instance void class stringy.B::'.ctor'()
IL_0011: ret
} // end of method C::.ctor
你会看到,C的构造函数会调用B的构造函数,类似地,B的构造函数也会调用A的构造函数,所以基的实例确实存在,不需要创建另一个对象实例。为了更清楚地证明这一点,这里是方法M1在IL 中的样子
// method line 4
.method public hidebysig
instance default int32 M1 () cil managed
{
// Method begins at RVA 0x2120
// Code size 21 (0x15)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldfld int32 stringy.C::x
IL_0006: ldarg.0
IL_0007: ldfld int32 stringy.B::x
IL_000c: add
IL_000d: ldarg.0
IL_000e: ldfld int32 stringy.A::x
IL_0013: add
IL_0014: ret
} // end of method C::M1
stringy
是命名空间。顺便说一句,你应该声明像这样的子类
public class B:A
{
public new int x = 100;
}
如果您想在基类中隐藏字段x。