Может ли подкласс наследовать конструктор? - PullRequest
2 голосов
/ 25 июня 2009
  1. У меня есть базовый класс "B", который имеет два конструктора, один без paremeters и другой, который принимает один параметр, целое число
  2. У меня есть подкласс "S", который наследует от "B" и не определить любые конструкторы в нем.
  3. Я создаю экземпляр S, пытаясь перейти к конструктор целое число.

Я получаю ошибку:

Error 1 Too many arguments to 'Public Sub New() "

Это удивляет меня, потому что я подумал, что если конструктор не определен в подклассе S, то метод конструктора базового класса, в частности, метод с одним целочисленным параметром, будет вызван без ошибки.

У вас есть идеи, почему я получаю эту ошибку? Являются ли конструкторы особым случаем?

Ответы [ 8 ]

6 голосов
/ 25 июня 2009

Как вы подозреваете, конструкторы не наследуются. Подклассы должны реализовывать свои собственные конструкторы. Причина в том, что конструкторы базового класса не будут знать, как инициализировать члены подкласса, поэтому их вызов приведет к тому, что объект подкласса будет в плохом состоянии.

6 голосов
/ 25 июня 2009

Конструктор для класса применяется только к классу, в котором он определен, даже в отношениях наследования. Чтобы иметь возможность воспользоваться конструктором 1-arg базового класса, вам нужно сделать что-то вроде этого (в C #):

public class S : B
{
    public S()
    {
        // do something for S
    }

    public S(int myInt) : base(myInt)
    {
        // do something for S
    }
}
2 голосов
/ 25 июня 2009

Похоже, вы используете VB.В этом случае вам необходимо явно вызвать соответствующий конструктор базового класса из конструктора подкласса.

Когда создается экземпляр производного класса, сначала выполняется конструктор Sub New базового класса, а затемконструкторами в производных классах. Ссылка на страницу

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

1 голос
/ 25 июня 2009

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

Это код C #. VB должен быть похожим.

class B
    {
        protected int aInt;
        private int bInt;
        public B()
        { }

        public B(int myInt)
        {
            aInt = myInt;
        }
    }

    class S : B
    {
        public S(int aInt, int bInt)
            : base(bInt)
        {
            base.aInt = aInt;
        }
    }
1 голос
/ 25 июня 2009

Нет. Это неверное предположение.

Если вы не определяете конструктор, добавляется конструктор без параметров.

0 голосов
/ 25 июня 2009

Первый оператор в конструкторе должен быть mybase.New. Причина этого в том, что все классы наследуются от класса Object, и конструктор должен вызывать конструктор своего базового класса.

0 голосов
/ 25 июня 2009

Обычно конструктор базового класса не является публичным. Скорее, он обычно вызывается из конструктора подкласса.

У всех классов есть конструктор, независимо от того, определяете вы его или нет. В вашем случае, я подозреваю, что ваш вызов конструктора подкласса завершился неудачно, потому что в подклассе не определен конструктор, который принимает один параметр.

0 голосов
/ 25 июня 2009

Если вы не добавляете конструктор в класс явно, у него есть пустой конструктор без аргументов по умолчанию. И я думаю, что это отвечает на ваш вопрос:)

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