Тип «MyProject.Bike» не содержит конструктор, который принимает аргументы «0» C # - PullRequest
1 голос
/ 01 февраля 2012

Моя проблема, возможно, довольно проста, но я только начал программировать на C #.

Моя проблема, как указано выше: «Тип« MyProject.Bike »не содержит конструктор, который принимает« 0 »аргументов».

Я не понимаю, потому что я не пытаюсь вызвать этот конструктор с пустыми скобками, и на чтение похожих вопросов ответили: «У вас слишком много / недостаточно параметров ...».

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

Мой код:

using System;  
namespace MijnConsoleProject
{
    public class Bike
    {
        protected int speed = 0;
        public String name
        {
            get;
            set;
        }
        public void speedUp(int increment)
        {
            this.speed += increment;
        }
        public void slowDown(int decrement)
        {
            this.speed -= decrement;
            {

        public override string ToString ()
        {
            return name + ": speed = " + speed;
        }

        public Bike(int initSpeed)
        {
            this.speed = initSpeed;
        }
    }

    public class GearedBike : Bike
    {
        private int gear;

        public GearedBike(string name)
        {
            this.name = name;
        }

        public bool changeGear(int gear)
        {
            if(gear < 8 && gear > 0)
            {
                this.gear = gear;
                return true;
            }
            else
            {
                return false;
            }
        }

        public override string ToString ()
        {
             return name + ": speed=" + speed + ", gear=" +gear;
        }

        public static void main(String[] args)
        {
            Bike fiets = new Bike(10);
            Console.WriteLine("[Normal Bike:]");
            Console.WriteLine("{0}\n", fiets);

            GearedBike fiets2 = new GearedBike("Fiets");
            Console.WriteLine("[Geared Bike:]");
            Console.WriteLine("{0}\n", fiets2);
        }
    }
}

Ответы [ 5 ]

2 голосов
/ 01 февраля 2012

Ваш Bike класс имеет только один конструктор:

    public Bike(int initSpeed)
    {
        this.speed = initSpeed;
    }

Это принимает один параметр.

Когда вы наследуете класс, конструктор производного класса вызывает конструктор из базыclass.

В конструкторе GearedBike class 'вы не указываете, какой конструктор из Bike вызывать, поэтому компилятор принимает Bike(), которого не существует.

Youвозможно, вам нужно что-то вроде ниже, где мы указываем, какой базовый конструктор вызывать, и передаем соответствующее значение.

    public GearedBike(string name)
        : base(0)
    {
        this.name = name;
    }

Вы также можете захотеть конструктор GearedBike, где вы можете установить скорость и имя, напримерниже:

    public GearedBike(string name, int initSpeed)
        : base(initSpeed)
    {
        this.name = name;
    }
2 голосов
/ 01 февраля 2012

Конструктор public GearedBike(string name) { ... } является сокращением для public GearedBike(string name) : base() { ... }

. Вы должны вызвать конструктор базового класса с аргументом из конструктора подкласса или добавить конструктор 0-param к вашему базовому классу.класс.

public GearedBike(string name) : base(42) {
  // ...
}
0 голосов
/ 01 февраля 2012

Компилятор C # может сгенерировать конструктор по умолчанию, который может выглядеть как

public Bike()
{

}

Это произойдет, только если тип не имеет пользовательских конструкторов.В вашем случае класс Bike имеет конструктор, который принимает int:

public Bike(int initSpeed)
{
    this.speed = initSpeed;
}

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


Позже в вашем коде типGearedBike использует конструктор родительского типа, вызывая :base() (который добавляется компилятором), и этот вызов завершается ошибкой, поскольку в базовом классе нет конструктора без параметров.

0 голосов
/ 01 февраля 2012

GearedBike не вызывает конструктор базового класса.Если вы явно не вызовете конструктор для базового класса, компилятор вызовет конструктор по умолчанию для базового класса.Базовый класс не содержит конструктор по умолчанию;для этого вы получаете сообщение об ошибке.

0 голосов
/ 01 февраля 2012

Конструктор не наследуется, поэтому в классе велосипед простирается базовый класс construcotr:

public GearedBike(string name):base(name)
        {
            this.name = name;
        }

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

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