类型“;MyProject.Bike”;不包含采用';0';参数C#

本文关键字:参数 MyProject Bike 类型 包含采 | 更新日期: 2023-09-27 18:22:03

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

类型“;MyProject.Bike”;不包含采用';0';参数C#

Bike类只有一个构造函数:

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

这只需要一个参数。

当您派生一个派生类时,该派生类的构造函数从基类调用构造函数。

GearedBike类的构造函数中,您没有指定要调用Bike的哪个构造函数,因此编译器假定Bike()不存在。

您可能想要下面这样的东西,我们在其中指定要调用的基构造函数,并传递适当的值。

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

您可能还想要一个GearedBike构造函数,可以在其中设置速度和名称,如下所示:

    public GearedBike(string name, int initSpeed)
        : base(initSpeed)
    {
        this.name = name;
    }
构造函数public GearedBike(string name) { ... }public GearedBike(string name) : base() { ... } 的简写

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

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

构造函数不是继承的,因此在类extends bike中,您必须调用基类constructr:

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

如果基类有一个无参数的构造函数

,则不需要这样做GearedBike不在基类上调用构造函数。如果没有显式调用基类上的构造函数,编译器将调用基类上默认的构造函数。基类不包含默认构造函数;因此,您收到了一个错误。

C#编译器可以生成一个默认构造函数,它可能看起来像

public Bike()
{
}

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

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

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


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