“MyProject.Bike”类型不包含带有'0'参数的构造函数C#

时间:2012-02-01 14:44:44

标签: c# inheritance constructor

我的问题可能很简单,但我刚开始用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);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

构造函数public GearedBike(string name) { ... }public GearedBike(string name) : base() { ... }

的简写

您必须使用子类构造函数中的参数调用基类构造函数,或者将0-param构造函数添加到基类中。

public GearedBike(string name) : base(42) {
  // ...
}

答案 1 :(得分:0)

GearedBike不会在基类上调用构造函数。如果没有在基类上显式调用构造函数,编译器将调用基类的默认构造函数。基类不包含默认构造函数;因此,您收到一条错误说明。

答案 2 :(得分:0)

C#编译器可以生成一个看起来像

的默认构造函数
public Bike()
{

}

只有在类型没有任何用户定义的构造函数时才会发生这种情况。在你的例子中,类Bike有一个构造函数,它接受一个int:

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

前编译器不会生成默认的无参数构造函数。


稍后在代码中,类型GearedBike通过调用:base()(由编译器添加)来使用父类型的构造函数,并且此调用失败,因为基类中没有无参数构造函数。