c#在子类和基类中使用相同的变量
本文关键字:变量 子类 基类 | 更新日期: 2023-09-27 18:13:45
这可能是一个愚蠢的问题,但我是c#的初学者,所以请原谅我。
如果我在基类和子类中命名相同的变量会发生什么?
例如:class BaseClass01
{
int x = 10;
}
class SubClass01 : BaseClass01
{
int x = 20;
public int Multiplicative(int a)
{
return x * a;
}
}
如果a = 10,我的答案是200。
这是否意味着basecclass01中的变量"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);
}
Subtraction()继续使用BaseClass01中的"x"值(即x仍然是10)。使用protected关键字可以完全避免这个问题。
谢谢你的解释!
是的,因为第一类中的x
是私有的,驱动类看不到它。但是如果把它(在基类中)设置为protected,并这样使用它,编译器会给你一个警告:
SubClass01警告。隐藏继承的成员basecclass01 .x。使用如果要隐藏,则添加新关键字。
其实是说你新的,所以又不一样了。
,在这种情况下最好使用new
关键字。
是的,它们是碰巧具有相同非限定名的不同字段。
你可以想到:
public int Multiplicative(int a) { return x * a; }
:
public int Multiplicative(int a) { return this.x * a; }
使用base
关键字访问BaseClass01.x
:
public int Multiplicative(int a) { return base.x * a; }
(您还需要使BaseClass01.x
受保护,并将SubClass01.x
标记为新)
是的,最初两个X都是私有的,所以它们只能在它们的类中访问,但如果父类中的X不是私有的,我们可以通过使用base来获取它。在子类中,编译器将在它声明的第一个块中搜索变量
内存中有两个地方存储int
,所以这里声明了两个(不相关的)变量。如果您只想声明一个变量,并且只想在子类中声明一个引用,那么省略第二个声明,并使用第一个声明protected int x;
它有助于思考一个类是如何在内存中作为一条记录表示的。每个字段用数据(值类型)或指针(引用类型)占用自己的内存空间。在本质上,你输入什么就是你得到什么。
因为它们都是私有的,所以子类只能访问它的x
变量