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

时间:2011-11-08 18:20:36

标签: c#

这可能是一个愚蠢的问题,但我是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关键字可以完全避免这个问题。

感谢您的解释!

5 个答案:

答案 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;

有助于考虑如何将类在内存中表示为记录。每个字段都使用数据(值类型)或指针(引用类型)占用自己的内存空间。从本质上讲,你输入的是你得到的东西。