如何将基本构造函数中的参数传递给派生构造函数?

时间:2013-11-05 02:42:37

标签: c# c#-4.0 constructor arguments

我的情况类似如下。

public abstract class Mammal{ public Mammal( name, legs ){ ... } }

public class Dog{ public Dog( name, legs ) : base ( name, legs ) { ... } }

我不想总是Dog dog = new Dog( "fido", 4 );我只想在Dog构造函数中使用“legs = 4”并仅传入名称。

但是,每当我试图将“腿”留在构造函数之外时,它会告诉我某些字段由于保护级别而无法访问。

我正在使用getter和setter,他们都是公开的。

编辑:这是最初的破类之一 -

    public Soil(int idNo, string soilName, string prefabName)
: base(idNo, soilName, price, weight, size, madeOf, prefabName, iconName){

            Price = 0;

    Capacity = 1;
    CanHoldSizes = new ContainerSizes[] {ContainerSizes.seed};
    Contents = new Item[Capacity];      
}

我不想将所有8个参数放入新的Soil()中,而是只想将每个新的Soil()放入4中,并让构造函数将其余部分设置为默认值。

这会产生错误,例如:“`Item.price'由于其保护级别而无法访问”

2 个答案:

答案 0 :(得分:4)

你可以这样做

public class Dog
{        
    public Dog(string name) : base ( name, 4) { } 

    //OR this

    public Dog(string name, int legs = 4) : base ( name, legs) { }
}

第一个构造者将始终创建一个有4条腿的哺乳动物。

第二个允许您执行此操作new Dog("MyDog"),但编译器将用new Dog("MyDog",4)替换此代码。

当然,使用第二个,你仍然可以做到这一点new Dog("MyDog",3),它会创造一条有三条腿的狗。

答案 1 :(得分:3)

我一定错过了什么。这不简单吗?

public class Dog
{
    public Dog(string name) : base (name, 4)
    {
    }
}