в C #, как получить доступ к значению переменной базового класса из дочернего класса - PullRequest
0 голосов
/ 04 мая 2018

Базовый класс

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 голосов
/ 04 мая 2018

Вот как использовать наследование:

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.

0 голосов
/ 04 мая 2018

Если вы хотите получить ожидаемый результат, поместите модификатор static перед переменными a и / или b, например:

  static protected int a;
  static protected int b;

После этого, если вы нажмете эту кнопку, она выведет:

msg=Hello World 100
0 голосов
/ 04 мая 2018
     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 ");

Тогда вы получите желаемый результат

0 голосов
/ 04 мая 2018

вы должны называть свой базовый класс таким образом

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 разрешит доступ к нему только внутри дочернего класса

0 голосов
/ 04 мая 2018

Объект, который вы создали в 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, они не связаны, если не являются одним и тем же объектом.

0 голосов
/ 04 мая 2018

Прежде всего, не ясно, чего вы пытаетесь достичь.

Есть много проблем с этим кодом. Во-первых, вы не должны создавать экземпляр TestChild внутри метода класса TestBase. Если вы создадите экземпляр TestBase внутри btnTest_Click, то вы не сможете получить доступ ни к одному из методов или данных TestChild (за исключением того, что вы создаете экземпляр TestChild внутри TestBase, что является плохой практикой).

Целью наследования обычно является расширение данных / методов для базового класса, а не использование унаследованного класса внутри базового класса. Кроме того, с помощью набора унаследованных классов вы можете достичь полиморфизма, который является еще одним основным принципом объектно-ориентированного программирования. Вы должны лучше понять эти принципы, и тогда код станет более понятным.

0 голосов
/ 04 мая 2018

Объект child внутри вашей TestBase не знает, где он находится. Он не знает, что находится внутри класса.

Когда вы создаете child , вы также создаете совершенно другой объект TestBase, который отличается от того, что содержит child . При создании этого объекта a будет инициализирован значением по умолчанию, которое в данном случае равно 0.

Если вы хотите перенести значение a в другой объект, вы должны передать его ему. Например через конструктор.


Звоните так:

TestChild child = new TestChild(a);

Создайте конструктор так:

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

К сожалению, ваша концепция кровоточит отовсюду, поэтому она не будет работать в этой форме. Я рекомендую изучить наследство больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...