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关键字可以完全避免这个问题。

谢谢你的解释!

c#在子类和基类中使用相同的变量

是的,因为第一类中的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变量