Что на самом деле делает Base Keyword при инициализации конструктора? - PullRequest
6 голосов
/ 17 ноября 2011

Я был смущен ключевым словом base в C #. Скажем, у меня есть такой код:

​class A
{
    ​// member declaration....
    A(int s, int t, int x)
    {
        ​// assign the values of members
    }
}

class B : A
{
    // member declaration....
    ​B(int a, int b, int c, int d) : base(a,b,c)
    {
        // does the base keyword play a role in
        // this constructor?
    }
}
​

Теперь, как точно используется ключевое слово base в конструкторе B? У меня есть несколько вопросов, чтобы уточнить:

  1. Использование ключевого слова base вызовет конструктор базового класса A (в нашем примере)? Это правильно?
  2. Предоставление ключевого слова base в производном классе изменяет поведение конструктора производного класса?

И вообще, когда в конструкторе должно использоваться ключевое слово base (некоторые примеры были бы хорошими)?

Edit:

У меня есть еще один вопрос. Как я могу сообщить классу base о нашем классе derived через ключевое слово base?

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 17 ноября 2011

Да - base связывает с конструктором в базовом классе.

Если вы не указываете base или this (чтобы связать с другим конструктором в тот же класс ), эффект такой, как если бы вы имели base() цепочку к конструктору без параметров в базовом классе.В вашем примере это может привести к сбою компиляции, так как ваш базовый класс не имеет конструктора без параметров.

См. Мою статью по конструкторам для получения дополнительной информации.

4 голосов
/ 17 ноября 2011

Я думаю, что руководство довольно ясно для base:

Базовое ключевое слово используется для доступа к членам базового класса из производного класса:

  • Вызовите метод базового класса, который был переопределен другим методом.

  • Укажите, какой конструктор базового класса следует вызывать при создании экземпляровпроизводный класс.

public class BaseClass
{
    int num;

    public BaseClass()
    {
        Console.WriteLine("in BaseClass()");
    }

    public BaseClass(int i)
    {
        num = i;
        Console.WriteLine("in BaseClass(int i)");
    }

    public int GetNum()
    {
        return num;
    }
}

public class DerivedClass : BaseClass
{
    // This constructor will call BaseClass.BaseClass()
    public DerivedClass() : base()
    {
    }

    // This constructor will call BaseClass.BaseClass(int i)
    public DerivedClass(int i) : base(i)
    {
    }

    static void Main()
    {
        DerivedClass md = new DerivedClass();
        DerivedClass md1 = new DerivedClass(1);
    }
}

/*
Output:
in BaseClass()
in BaseClass(int i)
*/
3 голосов
/ 17 ноября 2011
  1. Да, это вызывает конструктор базового класса.

  2. Производный конструктор всегда вызывает конструктор базового класса; если вы не укажете его, он попытается вызвать конструктор без параметров (если он существует). Этот синтаксис позволяет передавать параметры в конкретный конструктор базового класса. Обратите внимание, что в этом случае нет открытого или защищенного конструктора базового класса без параметров, поэтому вам необходимо использовать синтаксис «base» с параметрами.

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