具有一个参数的多个构造函数

时间:2012-03-02 21:54:42

标签: c#

所以,在学校,我们得到了一个在OOP上开车的任务,到现在为止它非常简单直接。但现在我需要创建四个构造函数,一个没有参数,两个有一个参数,一个有两个参数。

据我所知,重载工作的方式是它检查你提供它的参数数量,然后检查它必须使用哪个constuctor。由于两个构造函数相同,都接受整数,只有一个需要改变数量或齿轮,另一个需要改变最大速度。

有没有办法在不传递额外参数的情况下这样做?

5 个答案:

答案 0 :(得分:14)

  

据我所知,重载工作的方式是它检查你提供的参数数量,然后检查它必须使用哪个构造。

不,重载不仅仅基于参数的数量 - 它也基于类型

然而:

  

由于两个构造函数相同,因此都接受字符串

这是一个问题。你不能像这样声明两个构造函数:

public Foo(string x)
{
}

public Foo(string y)
{
}

就重载而言,这些签名会发生冲突。

我建议使用公共静态工厂方法,以便指定您要创建的内容:

public static Foo FromGears(string gears)
{
    return new Foo(...);
}

public static Foo FromMaximumSpeed(string maxSpeed)
{
    return new Foo(...);
}

然后你可能有一个构造函数接受两个值,并默认从工厂方法调用构造函数时丢失的那个。

但是,您的描述还有两个奇怪之处:<​​/ p>

  • 您正在使用字符串获取两个值,这些值听起来应该是数字(或者可能是一个数字,一个数字和单位)
  • 您正在谈论声明构造函数,但之后使用“更改”一词,就好像它们将要更改现有实例一样。这没有意义 - 构造函数用于创建 new 对象。

编辑:好的,现在我们知道了一点,这就是我的意思:

public class Car
{
    private const int DefaultGears = 5;
    private const int DefaultTopSpeed = 180;

    private readonly int gears;
    private readonly int topSpeed;

    public Car(int gears, int topSpeed)
    {
        this.gears = gears;
        this.topSpeed = topSpeed;
    }

    public static Car CreateWithGears(int gears)
    {
        return new Car(gears, DefaultTopSpeed);
    }

    public static Car CreateWithTopSpeed(int topSpeed)
    {
        return new Car(topSpeed, DefaultGears);
    }
}

请注意,可以在C#4中使用可选参数和命名参数:

public class Car
{
    public const int DefaultGears = 5;
    public const int DefaultTopSpeed = 180;

    private readonly int gears;
    private readonly int topSpeed;

    public Car(int gears = DefaultGears, int topSpeed = DefaultTopSpeed)
    {
        this.gears = gears;
        this.topSpeed = topSpeed;
    }
}

然后:

Car car = new Car(gears: 4);
Car car = new Car(topSpeed: 30);

一般情况下我不会建议这样做 - 当然你也不会对这种语言比较陌生。可选参数有各种细微之处。

答案 1 :(得分:1)

重载方法(和构造函数)的签名必须不同。这意味着它们必须具有不同数量的参数或具有不同类型(或两者)的参数。不考虑参数的名称。这意味着你不能让两个构造函数都有一个字符串参数。

除了初始化对象之外,构造函数不会改变任何东西。如果要更改值,请考虑添加ChangeGears(string gears)等方法。

答案 2 :(得分:1)

总之没有。构造函数不仅取决于参数的数量,还取决于它们的类型。

public Car(string gears)
{

}

public Car(string maxSpeed)
{

}

你不能调用它,因为它们本质上是相同的构造函数,想一想,当你传入一个字符串时,它是一个你要传递的值,所以编译器不知道要使用什么构造函数:如果您想将齿轮数设置为6或最大速度设置为6,则呼叫仍为new Car("6"),您会说不明确吗?

家庭作业规范不能说有两个带字符串的构造函数,因为这是不可能的。实现这一目标的唯一理智方法是使用静态工厂方法或正如您所说的引入另一个参数。

看看你在其他答案中评论的内容让我相信这样的事情对你有用,但很难确切地知道你的家庭作业想要什么。

public Car()
{
    ... // Do your setting of your default values here (# of gears, max speed)
}

public Car(int n)
{
    if( n > 10 ) 
    {
        // Use n to set your max speed
    } else {
        // Use n to set your # of gears
    }
}

汽车似乎不太可能拥有超过10个齿轮,或者它的最大速度将小于10,因此通过这种方式,您可以使用单个构造器来设置您的齿轮数和最高速度。 (请记住,您已经问过这可能无法回答您的作业,但IMO使用可以设置最大速度和齿轮数而无需添加其他参数的构造函数就足够了,假设您有某种保证,车辆最大速度> 10且齿轮数<10)

答案 3 :(得分:1)

每个方法(包括构造函数)都有签名。签名由参数 Types 及其 order 组成。您不能拥有两个共享相同名称和签名的方法。

我假设参数是字符串的要求是一种误解。在这种情况下,我假设齿轮的数量总是一个整数 - 最好用整数表示。最大速度可能是一个小数值 - 可能是一个双倍或浮动。

public class Car
{
  public Car( int gears ) {}
  public Car( float maxSpeed ) {}
}

答案 4 :(得分:0)

public Car(string param, bool isGear)
{
    if(isGear) 
         gears = param;
    else
         maxSpeed = param;
}