这可能是一个愚蠢的问题,但我是C#的初学者,所以请耐心等待。
如果我在基类和子类中将变量命名为相同,会发生什么?
例如:
class BaseClass01
{
int x = 10;
}
class SubClass01 : BaseClass01
{
int x = 20;
public int Multiplicative(int a)
{
return x * a;
}
}
如果a = 10,我得到的答案是200。
这是否意味着BaseClass01中的变量“int x”与SubClass01中的“int x”不同?是否有人能够提供一个说明差异的例子?
感谢您提前帮助我解决这个令人困惑的继承概念!
编辑:
根据下面的评论,我修改了代码,并意识到当从基类访问方法时,子类中的“x”不会继续:
class BaseClass01
{
int x = 10;
public int Subtraction(int a)
{
return a - x;
}
}
class SubClass01 : BaseClass01
{
int x = 20;
public int Multiplicative(int a)
{
x = x * a
return x;
}
}
private void button4_Click(object sender, EventArgs e)
{
SubClass01 sb = new SubClass01();
int answer1 = sb.Multiplicative(10);
int answer2 = sb.Subtraction(answer1);
}
减法()继续使用BaseClass01中的“x”值(即x保持为10)。使用protected关键字可以完全避免这个问题。
感谢您的解释!
答案 0 :(得分:6)
是的,因为头等舱中的x
是私有的,而驾驶类无法看到它。但是如果让它(在基类中)受到保护,并以这种方式使用它,编译器会给你一个警告:
警告SubClass01.x隐藏继承的成员BaseClass01 .x。使用 如果想隐藏新关键字。
事实上说你是新手,所以又是不同的。
在这种情况下最好使用new
关键字。
答案 1 :(得分:4)
是的,它们是碰巧具有相同不合格名称的不同字段。
你可以想到:
public int Multiplicative(int a) { return x * a; }
为:
public int Multiplicative(int a) { return this.x * a; }
要访问BaseClass01.x
,请使用base
关键字:
public int Multiplicative(int a) { return base.x * a; }
(您还需要对BaseClass01.x
进行保护并将SubClass01.x
标记为新内容。)
答案 2 :(得分:1)
是的,起初这两个X都是私有的,所以它们只能在它们的类中访问,但是如果父类中的x不是私有的,我们可以通过在子类中使用base.x来获取它,编译器将在第一个块中获取变量声明
答案 3 :(得分:0)
由于它们都是私有的,因此子类只能访问其x
变量。
答案 4 :(得分:0)
内存中有两个存储int
的位置,所以是的,这里声明了两个(不相关的)变量。如果您只想声明一个变量,并且只有子类中的引用,则省略第二个声明并生成第一个声明protected int x;
有助于考虑如何将类在内存中表示为记录。每个字段都使用数据(值类型)或指针(引用类型)占用自己的内存空间。从本质上讲,你输入的是你得到的东西。