C #, использующий одну и ту же переменную в подклассе и базовом классе

#c#

#c#

Вопрос:

Возможно, это глупый вопрос, но я новичок в C #, поэтому, пожалуйста, потерпите меня.

Что произойдет, если я назову переменную одинаково как в базовом классе, так и в подклассе?

Например:

 class BaseClass01
{
    int x = 10;
}

class SubClass01 : BaseClass01
{
    int x = 20;

    public int Multiplicative(int a)
    {
        return x * a;
    }
}
  

если a = 10, то ответ, который я получил, был 200.

Означает ли это, что переменная «int x» в BaseClass01 отличается от «int x» в SubClass01? Кто-нибудь сможет привести пример, иллюстрирующий различия?

Заранее спасибо, что помогли мне разобраться в этой запутанной концепции наследования!

Редактировать:

Основываясь на приведенных ниже комментариях, я повозился с кодом и понял, что при доступе к методам из базового класса «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);

    }
  

Функция вычитания () продолжает использовать значение «x» из BaseClass01 (т. е. x остается 10). Использование защищенного ключевого слова полностью устраняет проблему.

Спасибо за пояснения!

Комментарии:

1. Вот почему всегда полезно явно объявлять модификатор доступа для членов вашего класса.

2. Было бы интереснее, если бы вы объявили базовую переменную как protected . Обычно вы решаете это с помощью this.x , base.x или просто local x .

3. Это очень важная вещь для изучения, но поскольку вы только начинаете, не забывайте называть переменные соответствующим образом, и что в идеале переменные не должны быть одинаковыми. Намного проще читать и поддерживать.

Ответ №1:

Да, потому что x первый класс является частным, и управляемый класс не может его видеть. Но если сделать ее (в базовом классе) защищенной и использовать ее таким образом, компилятор выдаст вам предупреждение:

Предупреждение SubClass01.x скрывает унаследованный элемент BaseClass01 .x . Используйте ключевое слово new, если предполагалось скрыть.

на самом деле это говорит о том, что вы ее вводите, так что опять все по-другому.

и в этом случае лучше использовать new ключевое слово.

Ответ №2:

Да, это разные поля, которые случайно имеют одно и то же неквалифицированное имя.

Вы можете подумать о:

 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 protected и пометить SubClass01.x как new.)

Ответ №3:

Да, сначала оба X являются частными, поэтому они доступны только в своем классе, но если x в родительском классе не был частным, мы можем получить его с помощью base.x в подклассе, компилятор будет искать переменную hfor в первом объявленном ею блоке

Комментарии:

1. если бы она не была частной (и скрытой), вам не нужно было бы добавлять к ней префикс base.

2. @RuneFS Вы бы сделали, чтобы отличить его от SubClass01.x .

3. нам нужно различать две переменные с одинаковыми именами

4. @BrankoDimitrijevic тогда прочитайте комментарий еще раз 🙂 if it wasn't private (and **hidden**)´. If it's not hidden there's only one and if it's hidden you'd get a compiler warning which you hopefully treat as an error and go fix in which case you wouldn't need base either. The reason for the comment however was that this answer could be read as if you'd _always_ need to get to write база. ` чтобы получить доступ к чему-либо в базовом классе («если x в родительском классе не был закрытым, мы можем получить это, используя base.x в подклассе»)

Ответ №4:

В памяти есть два места, где хранится int , так что да, здесь объявлены две (не связанные) переменные. Если вы хотите, чтобы была объявлена только одна переменная и только ссылка в подклассе, тогда опустите второе объявление и создайте первое protected int x;

Это помогает подумать о том, как класс представлен в памяти в виде записи. Каждое поле занимает свое собственное пространство памяти либо данными (типами значений), либо указателем (ссылочными типами). По сути, то, что вы вводите, и есть то, что вы получаете.

Ответ №5:

Поскольку они оба являются частными, подкласс может получить доступ только к своей x переменной.