继承问题

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
"没有给出对应于Vehicle.Vehicle(double,string)所需形式参数'Horsepower'的参数"
不知道为什么我不能得到这个工作..感觉是如此愚蠢的PLZ帮助=)

Vehicle:
using System;

namespace vehicleclass
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("");
        }
    }
        public class Truck : Vehicle
        {
            private double load;
            public Truck(double HorsePower, string Color)
            {
                horsepower = HorsePower;
                color = Color;
            }
            public override void Calc_topspeed(double topspeed)
            {
                base.Calc_topspeed(topspeed);
                topspeed = horsepower / load;
            }
        }
        public class Vehicle
        {
            protected double horsepower;
            protected string color;

            public Vehicle(double Horsepower, string Color)
            {
                horsepower = Horsepower;
                color = Color;

            }
            public virtual void Calc_topspeed(double topspeed)
            {
                topspeed = horsepower / 0.8;
            }
            public void horn()
            {
                Console.WriteLine("Car horn sounds funky..");
            }

        }
    }
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,554
地点
悉尼,澳大利亚
编程经验
10+
如果派生类中的构造函数没有显式调用其基类的构造函数,则它将隐式调用其基类的无参数构造函数。如果基类没有无参数构造函数,那是不可能的,因此必须使用所需的参数显式调用构造函数。这意味着:
C#:
public Truck(double HorsePower, string Color)
需要更改为:
C#:
public Truck(double HorsePower, string Color)
    : base(HorsePower, Color)
因为您正在调用基本构造函数,并且正在设置那些受保护的字段,所以无需在派生构造函数中进行设置。因此,该构造函数主体应为空:
C#:
public Truck(double HorsePower, string Color)
    : base(HorsePower, Color)
{ }
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,554
地点
悉尼,澳大利亚
编程经验
10+
另外,方法参数应以小写字母开头。您显然知道这一点,因为您已经在 Calc_topspeed 方法。我猜您已更改大小写,以便区分字段中的参数。那是错误的行动方针。坦白说,您的命名约定根本就是约定,因为您无所不在。该代码应如下所示:
C#:
public class Truck : Vehicle
{
    private double load;

    public Truck(double horsePower, string color)
        : base(horsePower, color)
    { }

    public override void CalculateTopSpeed(double topSpeed)
    {
        base.CalculateTopSpeed(topSpeed);
        topSpeed = horsePower / load;
    }
}
public class Vehicle
{
    protected double horsePower;
    protected string color;

    public Vehicle(double horsePower, string color)
    {
        this.horsePower = horsePower;
        this.color = color;

    }

    public virtual void CalculateTopSpeed(double topSpeed)
    {
        topSpeed = horsePower / 0.8;
    }

    public void Horn()
    {
        Console.WriteLine("Car horn sounds funky..");
    }
}
您仍然有一些问题。首先,作为一般规则,字段和属性是数据,因此应基于名词,而方法是行为且应基于动词。名字 喇叭 是一个名词,因此它不是方法的名称。那应该是 SoundHorn 或者 嘟嘟角 或其他说明您正在用喇叭或喇叭做的事情。

但更重要的是 计算最高速度 方法(或您目前使用的任何较差名称)都是胡说八道。你传入 双倍的 按值,然后分配给该参数,但您不返回任何值。这意味着您将拥有从未使用过的输入以及从未输出过的结果。仅使用 车辆 以类为例,该方法应该没有参数并返回结果:
C#:
public virtual double CalculateTopSpeed()
{
    return horsePower / 0.8;
}
否则有一个 出去 参数并将其用于输出:
C#:
public virtual void CalculateTopSpeed(out double topSpeed)
{
    topSpeed = horsePower / 0.8;
}
如果您需要为此输出使用输出参数,则可以这样做,但是通常来说,您永远不会 空白 具有单个输出参数的方法。如果只想输出一个值,则返回该值。如果要输出多个值,则可以返回一个值,对其他值使用一个参数,或者对所有值使用参数。要确定哪个,您首先需要确定输出值本质上是否相同。如果是,则对所有输出参数使用输出参数,否则,返回具有特殊意义的参数。例如,如果您有一个输出矩形的高度和宽度的方法,则将使用两个输出参数,因为这两个值具有相同的意义。在众多情况下 TryParse .NET Framework中用于验证和解析文本输入的方法,该方法返回一个 布尔 指示输入是否有效,因为基本上总是使用该输入。如果输入有效,则使用参数输出解析结果。
 

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
另外,方法参数应以小写字母开头。您显然知道这一点,因为您已经在 Calc_topspeed 方法。我猜您已更改大小写,以便区分字段中的参数。那是错误的行动方针。坦白说,您的命名约定根本就是约定,因为您无所不在。该代码应如下所示:
C#:
public class Truck : Vehicle
{
    private double load;

    public Truck(double horsePower, string color)
        : base(horsePower, color)
    { }

    public override void CalculateTopSpeed(double topSpeed)
    {
        base.CalculateTopSpeed(topSpeed);
        topSpeed = horsePower / load;
    }
}
public class Vehicle
{
    protected double horsePower;
    protected string color;

    public Vehicle(double horsePower, string color)
    {
        this.horsePower = horsePower;
        this.color = color;

    }

    public virtual void CalculateTopSpeed(double topSpeed)
    {
        topSpeed = horsePower / 0.8;
    }

    public void Horn()
    {
        Console.WriteLine("Car horn sounds funky..");
    }
}
您仍然有一些问题。首先,作为一般规则,字段和属性是数据,因此应基于名词,而方法是行为且应基于动词。名字 喇叭 是一个名词,因此它不是方法的名称。那应该是 SoundHorn 或者 嘟嘟角 或其他说明您正在用喇叭或喇叭做的事情。

但更重要的是 计算最高速度 方法(或您目前使用的任何较差名称)都是胡说八道。你传入 双倍的 按值,然后分配给该参数,但您不返回任何值。这意味着您将拥有从未使用过的输入以及从未输出过的结果。仅使用 车辆 以类为例,该方法应该没有参数并返回结果:
C#:
public virtual double CalculateTopSpeed()
{
    return horsePower / 0.8;
}
否则有一个 出去 参数并将其用于输出:
C#:
public virtual void CalculateTopSpeed(out double topSpeed)
{
    topSpeed = horsePower / 0.8;
}
如果您需要为此输出使用输出参数,则可以这样做,但是通常来说,您永远不会 空白 具有单个输出参数的方法。如果只想输出一个值,则返回该值。如果要输出多个值,则可以返回一个值,对其他值使用一个参数,或者对所有值使用参数。要确定哪个,您首先需要确定输出值本质上是否相同。如果是,则对所有输出参数使用输出参数,否则,返回具有特殊意义的参数。例如,如果您有一个输出矩形的高度和宽度的方法,则将使用两个输出参数,因为这两个值具有相同的意义。在众多情况下 TryParse .NET Framework中用于验证和解析文本输入的方法,该方法返回一个 布尔 指示输入是否有效,因为基本上总是使用该输入。如果输入有效,则使用参数输出解析结果。

我试图跟踪所有命名规则,但它们没有任何逻辑! o_O  :哈哈: (obvi)这是另一个学校项目,我用这两个参数和方法为2个班级提供了UML代码,就是这样。.感谢所有帮助  (y)  :)
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,554
地点
悉尼,澳大利亚
编程经验
10+
我试图跟踪所有命名规则,但它们没有任何逻辑!
您是说老师使用的命名惯例还是野外使用的命名惯例?如果您指的是后者,那么您再也不会错了。基本上,默认情况下使用Pascal机壳。这意味着没有下划线,并且每个单词或名称部分中的第一个字母都以大写字母开头。该规则的例外是参数和其他变量。他们应该使用驼色的大写字母,因此以小写字母开头,但其他方面相同。局部变量和私有字段就是这种情况。公共场所应使用Pascal套管。
 

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
您是说老师使用的命名惯例还是野外使用的命名惯例?如果您指的是后者,那么您再也不会错了。基本上,默认情况下使用Pascal机壳。这意味着没有下划线,并且每个单词或名称部分中的第一个字母都以大写字母开头。该规则的例外是参数和其他变量。他们应该使用驼色的大写字母,因此以小写字母开头,但其他方面相同。局部变量和私有字段就是这种情况。公共场所应使用Pascal套管。
好,谢谢!在github上找到了一个不错的表
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,580
地点
弗吉尼亚州切萨皮克
编程经验
10+
并且一定要避免 @andrewmanuja 疯狂(且不正确)使用匈牙利表示法。首先,.NET Framework的建议是完全不使用匈牙利语,但是进入VB.NET的许多VB6程序员似乎都继承了匈牙利语。

您是否应该决定使用匈牙利表示法,是因为您发现这是切成薄片以来最好的做法-那么当您在纸上进行代码审阅并且没有可以执行符号查找的IDE时,它就回来了-请保持一致使用它,并为适当的类型使用正确的前缀。就个人而言,我建议您避免使用匈牙利语。
 

安德鲁·马努亚

知名会员
已加入
五月30,2019
留言内容
75
编程经验
Beginner
嗨跳伞者,

看,我仍然是编程的初学者,当然会出错。我认为,任何初学者都会犯错误,人们也会通过犯错误来学习东西。

因此,专家的工作不应是批评人们的错误,而应指导他们。

在学习过程中(由于我没有参加任何编程课程),我在很大程度上取决于互联网上的文章,有时还取决于youtube视频。

结果,可能有更高的可能性将我误导到错误的方向。

谢谢。

安德鲁
 

Netsid

成员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
And be sure to avoid @andrewmanuja 疯狂(且不正确)使用匈牙利表示法。首先,.NET Framework的建议是完全不使用匈牙利语,但是进入VB.NET的许多VB6程序员似乎都继承了匈牙利语。

您是否应该决定使用匈牙利表示法,是因为您发现这是切成薄片以来最好的做法-那么当您在纸上进行代码审阅并且没有可以执行符号查找的IDE时,它就回来了-请保持一致使用它,并为适当的类型使用正确的前缀。就个人而言,我建议您避免使用匈牙利语。

这是即时消息试图遵循的内容,但有时我只是在完成所有代码的编写之后再重命名所有代码,我认为这在即时消息学习期间会快很多。无论如何在github上找到了这个。
namingstandars.png
 
最佳 底部