在C#中,如何从子类访问基类变量值

时间:2018-05-04 06:57:28

标签: c# inheritance

基类

class TestBase
{
    protected int a;
    protected int b;

    public TestBase(int i)
    {
        a = i;
    }

    protected TestBase()
    {

    }

    public void Update(int i)
    {
        a = i;

        TestChild child = new TestChild();
        child.Update("Hello World ");
    }

儿童班

class TestChild:TestBase
{
    private string msg;
    public void Update (string s)
    {
        msg = s+ a.ToString();
        Console.WriteLine("msg=" + msg);

    }

}

调用

    private void btnTest_Click(object sender, EventArgs e)
    {
        TestBase t = new TestBase(1);
        t.Update(100);

    }

结果 Hello World 0

问题 我希望得到Hello World 100.显然,子类没有访问基类变量int a。我怎么能这样做?

7 个答案:

答案 0 :(得分:1)

您在TestBtn_Click中创建的对象与您在TestBase.Update中创建的对象无关。它们是两个不同的对象,因此每个对象都有自己的a字段,其值不同。

要生成您期望的输出,您需要在child.a中将this.a设置为Update

public void Update(int i)
{
    a = i;

    TestChild child = new TestChild();
    child.a = this.a;
    child.Update("Hello World ");
}

这里要理解的重要一点是继承不会影响对象。继承只影响类。基类成员也将出现在子类中。就是这样。 即使objA的类型继承自objB,它们也是不相关的,除非它们是同一个对象。

答案 1 :(得分:0)

TestBase中的 child 对象不知道他放在哪里。它不知道它属于一个类。

当您创建时,您还会创建一个完全不同的TestBase对象,该对象与包含的对象不同。当您创建该对象时,将被初始化为默认值,在这种情况下为0。

如果您想将a的值传递给其他对象,您应该将其赋予它。例如,通过构造函数。

这样打电话:

TestChild child = new TestChild(a);

制作一个这样的构造函数:

public TestChild(int x) : base(x){}

不幸的是,你的概念从各处流失,所以它不会以这种形式发挥作用。我建议更多地研究inheritance

答案 2 :(得分:0)

首先,目前还不清楚你想要完成什么。

此代码存在许多问题。首先,您不应该在TestBase类方法中创建TestChild的实例。如果你在btnTest_Click中创建一个TestBase实例,那么你将无法访问任何TestChild的方法或数据(除了你在TestBase中创建一个TestChild实例,这是不好的做法)。

继承的目的通常是扩展基类的数据/方法,而不是在基类中使用继承的类。此外,使用一组继承的类,您可以实现多态,这是面向对象编程的另一个核心原则。您应该更好地理解这些原则,然后代码将开始变得更有意义。

答案 3 :(得分:0)

你应该这样调用你的基类

class BaseClass
{
    int a;
    int b;
    protected BaseClass()
    { }

    protected BaseClass(int i)
    {
        a = i;
    }

    protected void Update(int i)
    {
        a = i;

        Console.Write("Hello World ");
    }
}

class TestChild : BaseClass
{
    public TestChild(int i) : base(i) //send your constuctor to your base class
    { }

    public TestChild()
    { }

    public void Update(int i)
    {
        base.Update(i);
        Console.Write(i.ToString());
    }
}

private void btnTest_Click(object sender, EventArgs e)
{
    TestChild t = new TestChild(); // create instance as your child
    t.Update(100);
}

将您的对象创建为您的子类,然后调用您的方法并让它调用您的基类

如果想要从孩子那里访问基类中的a或b

public int a;

public它可以让你从你创建的实例中访问它

protected只允许子类内部访问

答案 4 :(得分:0)

     public void Update(int i)
     {
     a = i;
     TestChild child = new TestChild(); 
     child.Update("Hello World "); 
     }

这是您为变量a赋值的地方,稍后您实例化了另一个不同的TestChild类实例。 在此实例化之后,您必须分配像

这样的值
    TestChild child = new TestChild();
    child.a = i;
    child.Update("Hello World ");

然后你将得到你想要的结果

答案 5 :(得分:0)

这是如何使用继承:

class Program
{
    static void Main(string[] args)
    {
        Dog dog = new Dog("Dalmata", "Fuffy", 7);
    }
}

class Animal
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Animal(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Dog : Animal
{
    public string Race { get; set; }

    public Dog(string race, string name, int age) : base(name, age)
    {
        Race = race;
    }
}

这样,即使它们在Animal中声明,你也可以访问Name和Age。

答案 6 :(得分:0)

如果您想获得预期结果,请在static和/或a变量的前面添加b修饰符,如下所示:

  static protected int a;
  static protected int b;

在此之后,如果按下该按钮,它将写出:

msg=Hello World 100